정규표현식 매칭 공식과 문법 패턴 플래그 검증 가이드

정규식 테스터

테스트할 정규식 패턴과 문자열을 입력하여 매치 개수와 하이라이트된 매칭 텍스트 구간을 즉시 검증하고 완성된 코드로 복사해 보세요.

데이터 파싱 로직을 개발하거나 텍스트 에디터에서 특정 패턴의 텍스트들을 일괄 치환해야 할 때, **정규표현식(Regular Expression, Regex)**은 코드의 양을 극적으로 줄여주는 강력한 도구입니다.

하지만 정규표현식은 특유의 가독성 낮은 상형문자 같은 패턴 문법과 난해한 매칭 규칙으로 인해 디버깅이 매우 까다롭고, 잘못 선언할 경우 무한 루프 상태에 빠져 CPU를 100% 점유하는 치명적인 정규식 폭탄 공격(ReDoS)을 야기하기도 합니다. 본 글에서는 정규표현식 매칭 엔진의 기본 공식과 플래그 활용 규칙을 해설합니다.


1. 정규표현식 매칭 공식과 문법 요소

정규표현식은 기본적으로 유한 상태 오토마톤(Finite State Automaton) 알고리즘을 기반으로 입력 문자열과 대조 작업을 수행합니다.

[ \text{Regex Match} = \text{FSA}(P_{\text{pattern}}, F_{\text{flags}}, T_{\text{target}}) ]

  • 핵심 특수문자 기호:
    • ^ : 문자열의 시작 지점 매칭
    • $ : 문자열의 끝 지점 매칭
    • . : 개행을 제외한 임의의 모든 단일 문자 매칭
    • * : 바로 앞 문자가 0번 이상 반복 매칭
    • + : 바로 앞 문자가 1번 이상 반복 매칭
    • ? : 바로 앞 문자가 존재하지 않거나 1번만 등장 ({0,1}과 매핑)
  • 글로벌 플래그(Flags) 제어 공식:
    • g (global): 첫 번째 매칭에 머무르지 않고, 타겟 텍스트 전체 범위에서 모든 일치 항목을 배열로 수집합니다.
    • i (ignoreCase): 영문 알파벳 대소문자를 구분하지 않고 유연하게 매치합니다.
    • m (multiline): ^$ 기호가 줄글 전체가 아닌 개행 단위의 각 행의 시작과 끝을 감지하도록 변환합니다.

2. 자바스크립트 RegExp 내장 매칭 함수 활용 공식

자바스크립트에서는 정규식 테스팅을 위해 여러 문자열 및 정규식 객체 메서드를 제공합니다.

// 정규식 리터럴 선언 (이메일 양식 패턴)
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;

// ① 단순 유효성 통과 검사 (true / false)
const isValid = emailRegex.test("user@example.com"); // true

// ② 매칭 항목 일괄 추출 (배열 리턴)
const text = "Contact: test1@aa.com or test2@bb.com";
const extractedEmails = text.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g);
// ["test1@aa.com", "test2@bb.com"]

[!NOTE] 매번 복잡한 패턴을 코드 상에서 콘솔 로그를 일일이 찍어가며 동작을 검사할 필요 없이, 정규식 테스터 도구를 활용하면 정규식 패턴과 플래그를 입력하는 즉시 테스트 영역 텍스트 내부의 매칭 단어들과 매칭 총수, 개별 캡처 그룹(Capture Group)을 형형색색의 하이라이트 뷰로 직관적으로 확인해 볼 수 있습니다.

정규식 테스터

테스트할 정규식 패턴과 문자열을 입력하여 매치 개수와 하이라이트된 매칭 텍스트 구간을 즉시 검증하고 완성된 코드로 복사해 보세요.


3. ReDoS(정규식 거부 공격) 예방을 위한 설계 팁

  1. Greedy 수량자 중첩 금지: (a+)+ 또는 (a|a+)* 와 같이 반복 연산자(*, +)가 중첩(Nested Quantifiers)되어 사용되면, 매칭이 실패하는 특정 에러 상황에서 엔진이 백트래킹(Backtracking) 연산을 수억 번 이상 수행하여 브라우저 메인 스레드를 완전히 뻗게 만듭니다. 이를 예방하기 위해 반복 패턴 단계를 단순하고 독립적인 범위로 세분화해 설계해야 합니다.
  2. 비탐욕적(Non-greedy) 매치 사용: .* 문법은 기본적으로 줄 전체를 최대한 길게 매치하려고 시도합니다. 첫 매칭 지점까지만 안전하게 수집하고 싶다면 물음표를 붙여 .*? 형태로 수집 범위를 한정해 주는 편이 연산 오버헤드를 줄이는 비결입니다.
가격 보기카톡 무료 상담