본문 바로가기

정규식 특수문자 이스케이프 완벽 가이드 - 헷갈리는 메타문자 12가지 정리

검색어에 점이나 괄호만 넣으면 에러가 나는 이유부터 언어별 이스케이프 함수, 자주 하는 실수까지 한 번에 정리했습니다.


정규식 특수문자 이스케이프 완벽 가이드 - 헷갈리는 메타문자 12가지 정리

코드에서 사용자가 입력한 단어를 정규식으로 검색하려다 갑자기 에러가 쏟아진 경험, 한 번쯤 있으실 겁니다. 검색어에 점(.)이나 괄호 하나가 들어가는 순간 결과가 엉뚱하게 나오거나 프로그램이 멈춰버립니다.

원인은 거의 대부분 특수문자 이스케이프를 빠뜨린 것입니다. 정규식은 일부 문자를 일반 글자가 아니라 명령어로 해석하기 때문입니다. 이 문제의 구조를 이해하고 나면 처리는 의외로 간단합니다.

정규식에서 특수문자가 문제되는 이유

정규식에는 메타문자라고 부르는 특별한 기호들이 있습니다. 점(.)은 임의의 한 글자, 별표(*)는 0회 이상 반복, 괄호()는 그룹 묶기를 의미합니다. 즉 이 문자들은 글자 그대로의 의미가 아니라 패턴을 지시하는 신호로 동작합니다.

예를 들어 가격 표기 1.99를 찾으려고 정규식에 그대로 1.99를 넣으면, 점이 임의의 한 글자로 해석됩니다. 그 결과 199, 1A99, 1_99 같은 의도하지 않은 문자열까지 전부 일치하게 됩니다.

이스케이프란 특수한 의미를 가진 문자 앞에 역슬래시(\\)를 붙여 평범한 글자로 취급하라고 알려주는 작업입니다. 정규식 안정성의 출발점이자 보안의 기본이기도 합니다.

특히 사용자 입력값을 그대로 정규식에 넣으면 ReDoS라 불리는 정규식 기반 서비스 거부 공격에 노출될 수 있습니다. 입력을 패턴으로 쓸 때는 반드시 이스케이프를 거쳐야 하는 이유입니다.

반드시 이스케이프해야 하는 메타문자 12가지

대부분의 정규식 엔진에서 특별한 의미를 가지므로, 글자 그대로 매칭하려면 이스케이프가 필요한 문자는 다음과 같습니다.

문자이름정규식에서의 의미
.임의의 한 글자
^캐럿문자열 시작
$달러문자열 끝
*별표0회 이상 반복
+플러스1회 이상 반복
?물음표0회 또는 1회
( )소괄호그룹 묶기
[ ]대괄호문자 집합
{ }중괄호반복 횟수 지정
|파이프또는(OR)
\\역슬래시이스케이프 기호 자체
참고: 대괄호 안쪽(문자 클래스 내부)에서는 규칙이 달라집니다. 이때 특별한 의미를 갖는 문자는 ], \\, ^, - 정도로 줄어들고, 점이나 별표는 굳이 이스케이프하지 않아도 글자 그대로 취급됩니다.

언어별 이스케이프 처리 방법

직접 역슬래시를 일일이 붙이는 것은 실수가 잦습니다. 다행히 주요 언어 대부분은 문자열을 통째로 안전하게 변환해 주는 함수를 제공합니다.

  • Python: re.escape("1.99 (특가)") 표준 라이브러리에 내장되어 있어 가장 간단합니다.
  • Java: Pattern.quote(input) 입력 전체를 리터럴로 감싸 처리합니다.
  • PHP: preg_quote($input, '/') 두 번째 인자로 구분자까지 함께 이스케이프할 수 있습니다.

JavaScript는 직접 처리해야 합니다

자바스크립트에는 오랫동안 표준 이스케이프 함수가 없었습니다. 그래서 다음 코드를 직접 작성해 쓰는 경우가 많습니다.

  • str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
  • 위 패턴은 앞서 정리한 메타문자를 한 번에 잡아 역슬래시를 붙여 줍니다.

코드를 짜지 않고 텍스트 자체를 다듬거나 대량 치환만 필요할 때는, 브라우저에서 바로 쓰는 텍스트 변환기 같은 도구로 먼저 데이터를 정리한 뒤 패턴을 적용하면 작업이 한결 수월해집니다.

자주 발생하는 실수와 해결법

이스케이프 관련 버그는 패턴이 비슷합니다. 아래 세 가지만 피해도 대부분의 오류가 사라집니다.

  • 점만 이스케이프: 도메인이나 IP를 다룰 때 점은 처리하면서 다른 기호는 놓치는 경우. 입력 전체를 함수로 변환하는 습관이 안전합니다.
  • 이중 이스케이프 혼동: 문자열 리터럴에서 역슬래시 한 개를 쓰려면 코드상 두 개(\\\\)가 필요합니다. 이 차이를 놓쳐 패턴이 깨지는 일이 흔합니다.
  • 사용자 입력 미처리: 검색창 값을 그대로 패턴에 넣으면 오류와 보안 위험이 동시에 발생합니다.
팁: 의심스러우면 정규식 테스트 사이트(regex101 등)에 패턴과 대상 문자열을 넣어 실제 매칭을 눈으로 확인하세요. 머릿속 추론보다 훨씬 빠르게 원인을 찾을 수 있습니다.

실전 이스케이프 체크리스트

정규식을 작성하거나 배포하기 전에 아래 항목을 점검하면 대부분의 사고를 예방할 수 있습니다.

  • 사용자 입력을 패턴으로 쓸 때는 예외 없이 언어별 이스케이프 함수를 거쳤는가
  • 점, 괄호, 별표 등 12가지 메타문자가 글자 그대로 매칭되어야 하는데 빠진 것은 없는가
  • 문자열 리터럴의 역슬래시 개수가 의도와 맞는가
  • 테스트 도구로 실제 입력 몇 가지를 넣어 결과를 확인했는가

지금 바로 두 가지만 실천하세요. 첫째, 직접 역슬래시를 붙이지 말고 표준 이스케이프 함수를 쓰는 것. 둘째, 배포 전 테스트 사이트에서 실제 입력으로 검증하는 것. 이 두 습관만으로 정규식 관련 버그의 절반 이상이 사라집니다.

3일 무료체험큰손탐지기, 지금 바로 시작하세요

설치 없이 웹에서 바로 사용 가능 · PC & 모바일 지원

무료체험 시작
카카오톡 상담