Regex.CompileError 예외
Regex.CompileError 예외
정규 표현식(regular expression)을 컴파일하지 못할 때 던져지는 예외예요. Elixir에서 정규식은 사용 시점에 PCRE 엔진으로 컴파일되는데, 패턴 문법이 잘못되어 컴파일 단계에서 실패하면 이 예외가 발생합니다.
본문
이 예외는 정규식이 "실행"이 아니라 "컴파일" 단계에서 문제가 있음을 알려줍니다. 열지 않은 괄호, 잘못된 이스케이프 시퀀스, 깨진 수량자(quantifier) 같은 문법 오류가 대표적인 원인이에요. 패턴을 ~r 시그널(sigil)이나 Regex.compile!/2로 작성·컴파일하는 지점에서 바로 실패가 드러납니다.
# 열지 않은 괄호 — 컴파일 실패
Regex.compile!("(unclosed")
참고로 Regex.compile/2는 실패해도 예외를 던지지 않고 {:ok, regex} 또는 {:error, message} 튜플을 반환하는 반면, Regex.compile!/2와 ~r 시그널은 실패 시 이 Regex.CompileError 예외를 던집니다. 그래서 "검증되지 않은 패턴"을 다룰 때는 나중에 갑작스러운 예외를 만나기보다 Regex.compile/2로 미리 확인하는 편이 안전합니다.
case Regex.compile(pattern) do
{:ok, regex} -> regex
{:error, message} -> raise "잘못된 정규식: #{message}"
end
언제 어떤 경로가 이 예외를 던지나요
구체적으로 어느 경로가 이 예외를 던지는지 정리하면 이렇게 돼요.
~r시그널: 컴파일 타임에 리터럴로 작성되며, 문법이 잘못되면 컴파일 단계에서Regex.CompileError가 납니다. 리터럴이므로 보통 문제를 애초에 피할 수 있어요.Regex.compile!/2: 런타임에 패턴을 확인하고, 실패하면 즉시 예외를 던집니다. 외부 입력(설정 파일, 사용자 입력 등)에서 온 패턴을 컴파일할 때 많이 씁니다.Regex.compile/2: 예외 대신{:error, message}튜플을 반환하므로, 패턴이 올바르지 않아도 흐름을 멈추지 않으면서 우아하게 처리하고 싶을 때 적합합니다.
디버깅 팁
오류 메시지는 어느 토큰이 문제인지 대략적으로 가리키는 경우가 많아요. 패턴이 길고 복잡하다면 다음을 시도해 보세요.
- 오류 메시지가 가리키는 위치 주변부터 살펴보기
- 괄호(
(,[,{)가 서로 짝을 이루는지, 특히 이스케이프(\) 바로 뒤 문자를 확인 x수정자(extended)를 쓴 경우#이 주석으로 해석되어 패턴이 의도와 다르게 잘리는지 확인
더 알아보기
Regex— 정규 표현식 모듈의 전체 문서Regex.compile/2— 정규식 패턴을 컴파일하는 함수Regex.compile!/2— 실패 시 이 예외를 던지는 컴파일 함수~r시그널 — 패턴을 리터럴로 작성하는 시그널 문법Regex.recompile/1— 이미 컴파일된 정규식을 다시 컴파일하는 함수