정규 표현식(Regex) – 자바스크립트 RegExp 객체 활용법
RegExp 기본 개념
- 정규 표현식(Regular Expression) : 문자열에서 검색·일치·추출·치환 패턴을 정의
- JavaScript에 내장된
RegExp객체로 작성·조작 가능
const pattern = /abc/i; // 리터럴 방식 (대소문자 무시)
const pattern2 = new RegExp("abc", "i"); // 생성자 방식
RegExp 객체 생성 방법
리터럴 방식 🔸
const regex = /hello\d+/gi; // 숫자 포함 hello 전역·대소문자 무시
생성자 방식 🔸
const regex = new RegExp("hello\\d+", "gi");
플래그 g(global), i(ignore case), m(multiline) 등 조합 가능
핵심 메서드: exec() vs test()
| 메서드 | 반환 | 용도 |
|---|---|---|
exec(str) |
일치 배열 또는 null |
캡처 결과 필요할 때 |
test(str) |
true / false |
일치 여부만 필요할 때 |
const str = "abbcdefabgh";
const hit = /ab+/.exec(str); // ["abb"]
const exist = /ab+/.test(str); // true
자주 쓰는 정규식 플래그
| 플래그 | 설명 | 프로퍼티 |
|---|---|---|
g |
전역 검색 | regex.global |
i |
대·소문자 무시 | regex.ignoreCase |
m |
여러 줄 검색 | regex.multiline |
const r = /abc/gi;
console.log(r.source); // "abc"
패턴 구성 요소 🌐
| 패턴 | 의미 | 예시 |
|---|---|---|
. |
임의의 한 글자 | /h.t/ → hat, h5t |
* |
앞 문자가 0회 이상 | /go*gle/ |
+ |
앞 문자가 1회 이상 | /lo+l/ |
? |
앞 문자가 0 또는 1회 | /colou?r/ |
^ $ |
문자열 시작·끝 | /^Hi$/ |
[abc] |
a 또는 b 또는 c | /[aeiou]/ |
\d |
숫자(0-9) | /\d{4}/ |
\w |
단어 문자 | /\w+/ |
\s |
공백 문자 | /\s+/ |
기타 유용 메서드
const regex = /abc/i;
console.log(regex.toString()); // "/abc/i"
flags·source프로퍼티로 플래그·패턴 확인
실전 예시 🔧
// 1) 이메일 검증
const email = /^[\w.-]+@[\w.-]+\.\w+$/;
console.log(email.test("user@test.com")); // true
// 2) 하이라이트 치환
const txt = "The rain in Spain";
console.log(txt.replace(/ain/g, "<b>$&</b>"));
// The r<b>ain</b> in Sp<b>ain</b>
질문 정리
Q1. 왜 new RegExp() 보다 리터럴 방식을 많이 쓰나요?
리터럴은 가독성이 높고, 스크립트 로드 시 정규식이 바로 컴파일됩니다.
Q2. 플래그를 동적으로 변경하려면?
const src = /abc/i.source;
const dynamic = new RegExp(src, "gi"); // 기존 패턴 재사용
Q3. exec 반환 배열에서 인덱스·원본문자열을 알고 싶어요!
const res = /ab+/.exec("xxabbbxx");
console.log(res.index); // 2 (매치 시작 위치)
console.log(res.input); // "xxabbbxx"
정리
exec()→ 일치 값 반환,test()→ 일치 여부 반환- 플래그로 전역·대소문자·멀티라인 검색을 제어
- 정규식은 검증·파싱·치환 등 문자열 처리에 필수!
댓글남기기