정규표현식 실전 치트시트
정규표현식(Regular Expression, Regex)은 문자열에서 특정한 규칙을 가진 패턴을 찾거나 치환하기 위해 사용되는 형식 언어입니다. 겉보기에는 무작위한 특수 기호들의 나열처럼 보여서 학습하기 까다롭게 느껴질 수 있지만, 일단 기본 문법을 익히고 나면 수십 줄의 문자열 처리 코드를 단 한 줄로 줄여주는 강력한 마법 도구가 됩니다. 데이터 유효성 검사, 로그 분석, 복잡한 텍스트 치환 등 실무 개발에서 결코 피할 수 없는 핵심 기술입니다.
핵심 문법 요약
문자 클래스와 메타 문자
\d: 숫자 (0-9)\w: 알파벳, 숫자, 밑줄(_)\s: 공백 문자 (띄어쓰기, 탭 등).: 줄바꿈을 제외한 임의의 문자 한 개[abc]: a, b, c 중 하나[^abc]: a, b, c를 제외한 문자
수량자 (Quantifiers)
*: 0회 이상 반복+: 1회 이상 반복?: 0회 또는 1회 등장 (있거나 없거나){n,m}: n회 이상 m회 이하 반복
앵커와 그룹
^: 문자열의 시작$: 문자열의 끝(abc): 캡처 그룹. 문자열을 하나로 묶고 추출 가능a|b: a 또는 b
실무에서 바로 쓰는 패턴 해설
1. 한국 휴대전화 번호
/^010-\d{4}-\d{4}$/
가장 널리 쓰이는 형태입니다. 문자열의 시작과 끝을 앵커 기호(^, $)로 강제하여 다른 문자가 섞이는 것을 방지합니다. \d{4}는 숫자가 정확히 4자리 반복됨을 의미합니다.
2. 이메일 주소 검증
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
실제 서비스에서 자주 사용하는 실용적인 이메일 정규식입니다. 사실 RFC 5322 스펙을 완벽하게 충족하는 이메일 정규식은 수천 자에 달할 정도로 복잡하여 실효성이 없습니다. 위 패턴은 영문과 숫자, 특정 특수문자를 허용하고 @ 이후에 도메인 구조가 오는 일반적인 형태를 빠르고 효과적으로 걸러냅니다.
3. 한글 문자 추출
/[\uAC00-\uD7A3]/g
유니코드 범위를 이용한 패턴입니다. \uAC00는 '가', \uD7A3은 '힣'을 의미합니다. 문자열 내에서 완성형 한글만 정확히 찾아내거나 제거해야 할 때 아주 유용하게 쓰입니다.
4. HTML 태그 제거
/<[^>]*>/g
가벼운 텍스트 클리닝 작업 시 HTML 태그를 날려버리기 좋은 패턴입니다. < 기호로 시작하고 > 기호가 아닌 문자들을 탐색하다가 >로 닫히는 모든 덩어리를 찾습니다.
흔히 빠지는 함정 (Pitfalls)
탐욕적(Greedy) 매칭과 게으른(Lazy) 매칭
정규식의 *나 + 기호는 기본적으로 '탐욕적'으로 동작합니다. 즉, 조건을 만족하는 한도 내에서 최대한 많은 문자를 잡아먹으려고 합니다. 예를 들어 "<div>텍스트</div>"라는 문자열에 /<.*>/ 패턴을 적용하면, 첫 번째 <부터 마지막 >까지 전체가 하나로 매칭되어 버립니다. 이때 수량자 뒤에 ?를 붙여 /<.*?>/로 만들면 '게으른' 탐색을 수행하여 가장 처음 만나는 >에서 탐색을 멈춥니다.
치명적 역추적 (Catastrophic Backtracking)
매우 주의해야 할 성능 이슈입니다. 중첩된 그룹과 반복자를 잘못 결합하면(예: /(a+)+$/), 일치하지 않는 문자열을 검사할 때 정규식 엔진이 모든 가능한 경우의 수를 다 탐색하려고 시도합니다. 이로 인해 단 몇십 글자의 문자열을 검사하는 데에도 수 초에서 수 분이 걸리며 서비스의 CPU가 마비될 수 있습니다. 검증되지 않은 복잡한 정규식은 서버 장애의 원인이 되곤 합니다.