정규 표현식(Regex)은 텍스트, 로그 파일, 소스 코드 및 사용자 입력값에서 복잡한 문자열 패턴을 일치, 검증 및 추출하기 위한 간결하고 강력한 표기법입니다.
1. 정규 표현식 기초 문법과 메타 문자
정규 표현식은 리터럴 문자(예: abc) 또는 특정 문자 집합을 나타내는 메타 문자를 통해 패턴을 평가합니다:
\d: 모든 숫자(0-9).\w: 모든 단어 문자(영문자, 숫자, 밑줄).\s: 모든 공백 문자(스페이스, 탭, 줄바꿈).[a-z0-9]: 사용자 정의 문자 클래스.
2. 탐욕적(Greedy) vs 게으른(Lazy) 수량자 비교
기본적으로 *(0회 이상) 및 +(1회 이상)와 같은 수량자는 탐욕적(greedy)으로 동작하여 가능한 한 가장 긴 문자열과 일치합니다. 물음표(*? 또는 +?)를 덧붙이면 게으른(lazy) 일치가 되어 가장 짧은 부분 문자열만을 선택합니다.
3. 전방 탐색(Lookahead) 및 후방 탐색(Lookbehind) 어서션
너비가 0인 어서션(Zero-width assertions)은 실제 텍스트를 소비하지 않고 위치 조건만을 확인합니다:
(?=...)긍정형 전방 탐색: 뒤에 특정 패턴이 이어질 때 일치.(?!...)부정형 전방 탐색: 뒤에 특정 패턴이 이어지지 않을 때 일치.(?<=...)긍정형 후방 탐색: 앞에 특정 패턴이 선행할 때 일치.(?<!...)부정형 후방 탐색: 앞에 특정 패턴이 선행하지 않을 때 일치.
4. 파멸적 역추적(ReDoS) 방지 전략
NFA 엔진에서 중첩된 수량자(예: ([a-zA-Z]+)+$)가 포함된 패턴에 불일치 텍스트가 입력되면 계산량이 지수 함수적(O(2^n))으로 폭증하여 CPU를 독점하고 서버 스레드를 마비시키는 정규식 서비스 거부(ReDoS) 공격에 노출됩니다.