정규표현식 실전 치트시트

정규표현식(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가 마비될 수 있습니다. 검증되지 않은 복잡한 정규식은 서버 장애의 원인이 되곤 합니다.

정규표현식 직접 테스트해보기

작성한 패턴이 제대로 동작하는지, 예상치 못한 문자열을 잡아내지는 않는지 도구를 통해 검증하는 것이 좋습니다.

정규표현식 테스터 열기