tomai
로그인

Regex 핸드북: 실제로 자주 재사용하는 패턴

정규 표현식은 하나의 검색 언어를 한 줄에 압축한 것으로, 각 부품의 원리가 이해되기 전까지는 난해하게 느껴집니다. 이 핸드북에서는 실무의 80%를 해결하는 20%의 문법만 다룹니다. 붙여넣은 텍스트에서 이메일 찾기, 입력값 검증, 로그 분리, 파일명 일괄 변경이 대상입니다.

1. 리터럴, 점과 문자 클래스

대부분의 문자는 자기 자신과 일치하며, 점은 개행 이외의 임의의 한 문자와 일치합니다. 대괄호는 집합을 정의합니다. [0-9]는 임의의 숫자와 일치하고, [^0-9]는 숫자 이외의 임의의 문자와 일치하며, \d, \w, \s 같은 단축형은 숫자, 단어 문자, 공백을 처리합니다. 해당 위치에 무엇이 와야 하는지 알 때는 단순한 점 대신 명시적인 클래스를 우선해야 합니다.

2. 앵커와 수량자

^는 시작, $는 끝에 고정합니다. 따라서 ^hi는 hi로 시작하는 문자열에만 일치합니다. +는 1회 이상, *는 0회 이상, ?는 생략 가능을 나타냅니다. 이들 바로 뒤에 ?를 붙이면 탐욕이 아닌 지연 일치가 되어 마지막이 아니라 첫 번째 기회에서 멈춥니다. 탐욕과 지연의 차이가 예상 밖의 일치에서 가장 흔한 원인입니다.

3. 그룹, 선택과 룩어라운드

괄호는 그룹화와 캡처를 수행합니다. (cat|dog)s?는 cat, cats, dog, dogs 중 어느 하나와 일치합니다. (?:…)는 캡처 없이 그룹화합니다. \d+(?=px) 같은 전방 탐색은 뒤따르는 내용을 소비하지 않고 검사하므로, 접미사를 요구하면서 다음 일치를 위해 그 자리에 남겨 둘 수 있습니다. 이름 있는 그룹은 다음에 패턴을 읽는 사람을 위해 의도를 문서화합니다.

4. 플래그가 모든 것을 바꿉니다

닫는 슬래시 뒤의 문자가 엔진을 조정합니다. g는 첫 번째가 아니라 모든 일치를 찾고, i는 대소문자를 무시하며, m은 앵커를 줄 단위로 동작시키고, s는 점이 개행을 넘게 하며, u는 완전한 Unicode를 활성화하고, y는 일치를 한 위치에 고정합니다. 올바르게 보이는 패턴이 아무것도 반환하지 않을 때 플래그 조합이 원인인 경우가 많습니다.

5. 백트래킹 함정

(a+)+ 같은 중첩 수량자에 길고 일치하지 않는 문자열을 주면 엔진은 지수 함수적인 수의 경로를 따라가며 탭이 멈춥니다. 반복은 평평하게 유지하고, 지원하는 환경에서는 점유적인 재작성이나 원자 그룹을 선택하며, 출시 전에 적대적인 입력으로 의심스러운 패턴을 테스트해야 합니다. our regex tester에 붙여넣으면 모든 일치와 그룹이 브라우저 안에서 실시간으로 강조됩니다.