정규식이 일치하지 않는 이유와 해결법: 플래그(g, i, m, s), 줄바꿈 앵커, 이스케이프
목차
1. 직접 진단: 문법상 올바른 정규식이 일치하지 않는 이유
치트 시트에서 정상 작동하는 정규 표현식이 실제 코드에서 실패하는 주된 원인은 누락된 플래그, 줄바꿈(CRLF/LF) 불일치, 또는 이스케이프 오류 때문입니다. 패턴이 아무것도 찾지 못하거나 단어 하나 대신 문서 전체를 한 번에 삼켜버린다면 엔진의 탐색 모드를 먼저 점검해야 합니다.
패턴을 변경하기 전에 다음 핵심 메커니즘을 순서대로 점검하세요:
2. 필수 플래그 완벽 정리: g, i, m, s (m과 s를 혼동하지 마세요)
플래그는 정규식 엔진의 동작 모드를 결정합니다. JavaScript 및 ECMAScript 표준에서 가장 중요한 4개 플래그는 다음과 같습니다:

- g (Global): 첫 번째 일치에서 멈추지 않고 문자열 전체를 끝까지 탐색합니다.
- i (Ignore Case): 대소문자를 구분하지 않고 일치시킵니다.
- m (Multiline):
^와$가 전체 문자열의 처음과 끝뿐만 아니라 각 줄의 시작과 끝과 매칭되도록 합니다. - s (dotAll): 마침표(
.)가 줄바꿈 문자(\n,\r)와도 매칭되도록 확장합니다.
핵심 주의점: 멀티라인(m) 플래그를 켜도 점(.)이 줄바꿈을 통과하지 못합니다! 반대로 dotAll(s) 플래그를 켜도 ^와 $가 각 행의 경계와 매칭되지 않습니다. 두 플래그를 혼동하는 것이 가장 흔한 오류입니다.
3. 탐욕적(Greedy, .*) vs 게으른(Lazy, .*?) 수량자
기본적으로 수량자(*, +, {min,max})는 탐욕적(Greedy)입니다. 가능한 가장 많은 문자를 먼저 소비한 후 역추적(Backtracking)합니다.
<div>첫번째</div><div>두번째</div>에서 태그를 분리할 때:
탐욕적 패턴 <div>.*</div>: 첫 여는 태그부터 마지막 닫는 태그까지 전체를 거대한 하나의 덩어리로 가져옵니다.
게으른 패턴 <div>.*?</div>: 물음표를 붙이면 가장 가까운 닫는 태그에서 즉시 탐색을 멈추고 2개의 독립된 태그를 반환합니다.
4. 이스케이프와 역슬래시 함정 (일반 컨텍스트 vs 문자 클래스)
정규식은 구문 예약 메타문자를 사용합니다: \ ^ $ . | ? * + ( ) [ { } ]. 이스케이프 규칙은 컨텍스트에 따라 명확히 달라집니다:
- 문자 클래스 외부: 모든 구문 기호를 기호 그대로 검색하려면 반드시 역슬래시(예:
\.,\$)로 이스케이프해야 합니다. - 문자 클래스 내부(
[...]): 대부분의 메타문자는 고유한 구문 의미를 잃고 리터럴로 취급됩니다(예:[.]은 마침표,[*]는 별표). 대괄호 안에서 특별한 기능을 갖는 문자는^(맨 앞 배치 시 부정),-(범위 지정),](클래스 종료),\(이스케이프) 뿐입니다.
자바스크립트 소스코드에서는 정규식 리터럴과 문자열 생성자를 명확히 구분하여 작성해야 합니다:
// 1. Regex Literal (single backslash required)
const reLiteral = /^\d+\.\d+$/;
// 2. String Constructor (double backslash mandatory)
const reConstructor = new RegExp("^\\d+\\.\\d+$");5. GoToolstack 엔진에서 실측 검증된 실제 사례
ECMAScript 엔진을 기준으로 실제 입력과 기대 일치 결과를 검증한 예제입니다:
| 시나리오 및 입력 문자열 | 패턴 및 플래그 | 검증된 기대 일치 결과 |
|---|---|---|
ERROR 404 /api\nINFO 200 /home\nERROR 500 /db |
/^ERROR\s+(\d+)/gm |
ERROR 404, ERROR 500 |
Total cost: $49.99 USD |
/\$(\d+\.\d{2})/ |
$49.99 |
/* Multi-line |
/\/\*.*?\*\//s |
/* Multi-line |
6. 엔진별 차이점과 ReDoS(치명적 역추적) 방지
GoToolstack 테스터는 브라우저 내장 ECMAScript 엔진에서 실행됩니다. Python이나 PCRE에서 패턴을 가져올 때 주의할 점:
- 후방탐색(Lookbehind) 지원: 최신 JS(ES2018+)는 긍정
(?<=...)및 부정(?<!...)후방탐색을 지원합니다. 구형 브라우저에서는 오류가 발생할 수 있습니다. - 소유격 수량자 미지원: JavaScript에는 PCRE의
.*+나 원자적 그룹(?>...)이 존재하지 않습니다. - ReDoS 보안 위험:
(a+)+$처럼 중첩된 수량자는 일치하지 않는 문자열에서 수십억 번의 연산을 유발하여 브라우저를 멈추게 합니다. 본 도구는 Web Worker와 타임아웃 제한으로 브라우저를 보호합니다. - 완벽한 이메일 정규식의 허상: 수백 자에 달하는 단일 정규식으로 RFC 5322 이메일을 완벽히 검증하려 하지 마세요. 기본 구조 확인과 확인 메일 발송이 가장 안전합니다.
7. GoToolstack 클라이언트 개발자 유틸리티
서버 업로드 없이 브라우저에서 안전하게 정규식을 테스트하고 시각적으로 작성하세요:
기술 참고 자료 및 공식 표준 규격
- MDN Web Docs: JavaScript 정규 표현식 가이드.
- ECMA-262: ECMAScript 언어 사양 – RegExp 객체 표준.
- OWASP: ReDoS (정규식 서비스 거부) 방지 가이드.