T도구모음

정규식 테스터

정규표현식을 입력하고 테스트 문자열에서 매칭 결과를 확인합니다.

//g

정규식 테스터 — ECMA-262 엔진 위에서 PCRE와 RE2까지 이해하기

정규표현식(Regular Expression, Regex)은 1950년대 Stephen Kleene의 정규 언어 이론에서 출발해, Ken Thompson이 1968년 Unix ed 에디터에 최초 구현하면서 프로그래밍 세계의 필수 도구가 되었습니다. 현재 JavaScript는 ECMA-262 명세의 NFA(Nondeterministic Finite Automaton) 기반 엔진을, Perl/PHP/Python은 PCRE(Perl Compatible Regular Expressions)를, Go와 Cloudflare WAF는 선형 시간을 보장하는 RE2 엔진을 사용합니다. 이 테스터는 브라우저의 new RegExp(pattern, flags) — 즉 ECMA-262 엔진을 활용해 g(전역)/i(대소문자 무시)/m(다중행) 플래그 조합의 매칭 결과를 실시간으로 하이라이트하고, 캡처 그룹과 인덱스를 상세히 보여줍니다.

핵심 메타문자 레퍼런스

기호의미예시비고
^ / $시작 / 끝 앵커^Hello$m 플래그 시 줄 단위
\d / \D숫자 / 비숫자\d{3,4}[0-9]와 동일
\w / \W단어 문자 / 비단어\w+[a-zA-Z0-9_]
(?=...)전방 탐색 (lookahead)foo(?=bar)소비하지 않는 매칭
(?<=...)후방 탐색 (lookbehind)(?<=\$)\d+ES2018+ 지원
(?<name>...)명명 캡처 그룹(?<year>\d{4})ES2018+ 지원
*? / +?lazy quantifier<.*?>최소 매칭 우선

한국 실무 정규식 패턴 5가지

// 1. 한국 휴대폰 번호 (하이픈 선택적)
^01[016789]-?\d{3,4}-?\d{4}$
매칭: 010-1234-5678, 01012345678

// 2. 이메일 (RFC 5322 간이 버전)
^[\w.+-]+@[\w-]+(\.[\w-]+)+$
매칭: dev.kim@startup.co.kr

// 3. 한국 사업자등록번호 (3-2-5)
^\d{3}-\d{2}-\d{5}$
매칭: 123-45-67890

// 4. HTTPS URL 추출 (쿼리 파라미터 포함)
https?:\/\/[^\s"'<>]+

// 5. ISO 8601 타임스탬프
^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?$
매칭: 2024-01-15T09:30:00+09:00

실전 시나리오 — 프론트엔드 폼부터 서버 로그까지

  • React 폼 검증 — React Hook Form의 register("phone", { pattern: /^01[016789]-?\d{3,4}-?\d{4}$/ })로 실시간 검증.
  • Nginx 로그 파싱 — ^(\S+) \S+ \S+ \[([^\]]+)\] "(\w+) (\S+) HTTP/로 IP, 시각, HTTP 메서드, URL을 한 번에 캡처.
  • Git 커밋 메시지 훅 — ^(feat|fix|docs|refactor|test|chore)(\(.+\))?: .{1,72}$로 Conventional Commits 규칙을 pre-commit에서 강제.
  • ELK 스택 필터 — Logstash의 grok 플러그인에 정규식을 임베드해 비정형 로그를 구조화된 JSON으로 변환.
  • 마크다운 링크 추출 — \[([^\]]+)\]\(([^)]+)\)로 제목과 URL을 동시에 캡처해 링크 목록 자동 생성.

보안 위협 — ReDoS(Regular expression Denial of Service)

프로덕션에서 이메일 검증용 정규식 ^([a-zA-Z0-9]+)+@example\.com$을 배포했다가 공격자가 "aaaaaaaaaaaaaaaa!" 같은 입력을 반복적으로 던져 Node.js 이벤트 루프를 완전히 블로킹한 경험이 있습니다. 이것이 ReDoS 공격이며, 중첩 수량자((a+)+)가 만드는 "catastrophic backtracking"이 핵심 원인입니다. NFA 엔진은 모든 가능한 매칭 경로를 역추적하므로, 악의적 입력에 대해 O(2^N) 시간이 소요될 수 있습니다.

대응 방법은 네 가지입니다. (1) 중첩 수량자를 제거하고 [a-zA-Z0-9]+@처럼 단순화. (2) PCRE의 possessive quantifier(++)나 atomic group((?>...))으로 역추적 차단. (3) Go/Rust의 RE2 엔진(DFA 기반, 선형 시간 보장)으로 전환. (4) CI 파이프라인에 safe-regex / vuln-regex-detector 린터를 추가해 위험 패턴을 사전 차단. OWASP에서도 ReDoS를 웹 애플리케이션 취약점 목록에 포함하고 있으며, Cloudflare는 2019년 ReDoS로 인한 전 세계 서비스 장애를 겪은 후 WAF 규칙 엔진을 RE2로 교체했습니다.

엔진별 호환성 주의사항

  • JavaScript lookbehind((?<=...))는 ES2018부터 지원 — Safari 15 이전은 비지원이므로 polyfill이나 대체 패턴 필요.
  • 유니코드 속성 매칭(\p{Script=Hangul})은 반드시 u 플래그와 함께 사용해야 합니다.
  • Go RE2는 backreference(\1)를 지원하지 않으므로 HTML 태그 쌍 매칭 같은 패턴은 불가능합니다.
  • PCRE named group은 (?P<name>...), ECMA-262는 (?<name>...) — 엔진 이동 시 반드시 변환 필요.
  • ES2024의 v 플래그(unicodeSets)는 집합 연산([A--B], [[a-z]&&[^aeiou]])을 지원해 복잡한 문자 클래스를 간결하게 표현합니다.

관련 도구

정규식으로 추출한 문자열의 해시 지문을 만들 때는 해시 생성기, 매칭 결과의 변경 전후를 비교할 때는 텍스트 차이 비교를 활용하세요. 비밀번호 복잡도 정규식을 작성할 때는 비밀번호 생성기의 샘플로 테스트 데이터를 확보합니다.

참고 자료

  • ECMA-262 — ECMAScript Language Specification, Section 22.2 RegExp
  • MDN Web Docs — Regular Expressions (JavaScript Guide)
  • PCRE2 — Perl Compatible Regular Expressions (Philip Hazel)
  • Google RE2 — Efficient, principled regular expression library (GitHub)
  • OWASP — Regular Expression Denial of Service (ReDoS) Cheat Sheet

자주 묻는 질문

관련 도구