PatternSyntaxException 클래스란?
자바에서 PatternSyntaxException 클래스는 정규식(regex) 문자열에 문법 오류(syntax error)가 있을 때 발생하는 비검사 예외(unchecked exception)입니다. 즉, 컴파일 시점이 아닌 런타임에 Pattern.compile() 메서드로 잘못된 정규식을 컴파일하려고 할 때 던져집니다.
이 클래스는 java.util.regex 패키지에 속하며, IllegalArgumentException을 상속하기 때문에 반드시 try-catch로 처리할 필요는 없지만, 사용자 입력 기반으로 정규식을 생성하는 경우에는 예외 처리를 해주는 것이 안전합니다.
주요 메서드
PatternSyntaxException 클래스는 오류 정보를 자세히 확인할 수 있는 다음과 같은 핵심 메서드를 제공합니다.
getDescription() − 발생한 오류에 대한 설명을 반환합니다.
getIndex() − 오류가 발생한 위치(인덱스)를 반환합니다.
getPattern() − 오류가 포함된 정규식 패턴 전체를 반환합니다.
getMessage() − 오류 설명, 인덱스, 문제가 있는 패턴, 그리고 패턴 내 오류 위치를 표시한 캐럿(^)까지 포함한 전체 메시지를 반환합니다.
예제 코드
아래 예제는 닫히지 않은 대괄호 [처럼 잘못된 정규식을 컴파일했을 때 PatternSyntaxException이 발생하는 상황을 보여줍니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class PatternSyntaxExceptionExample {
public static void main(String args[]) {
// 사용자로부터 문자열 입력 받기
System.out.println("문자열을 입력하세요");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
// 의도적으로 잘못된 정규식 (닫히지 않은 문자 클래스)
String regex = "[";
try {
// 정규식 컴파일
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
// 공백 치환 수행
String result = matcher.replaceAll(" ");
System.out.print("공백 정리 후 텍스트: \n" + result);
} catch (PatternSyntaxException ex) {
System.out.println("설명(Description): " + ex.getDescription());
System.out.println("인덱스(Index): " + ex.getIndex());
System.out.println("메시지(Message): " + ex.getMessage());
System.out.println("패턴(Pattern): " + ex.getPattern());
}
}
}
실행 결과
문자열을 입력하세요 this is a [sample text [ 설명(Description): Unclosed character class 인덱스(Index): 0 메시지(Message): Unclosed character class near index 0 [ ^ 패턴(Pattern): [
실행 결과 분석
위 출력에서 확인할 수 있듯이, 정규식 [는 문자 클래스(character class)가 열린 채로 닫히지 않았기 때문에 "Unclosed character class"(닫히지 않은 문자 클래스)라는 오류 설명이 반환됩니다. 또한 getIndex()는 오류가 시작된 위치인 0을 반환하고, getMessage()는 오류 지점을 시각적으로 보여주는 캐럿(^) 기호와 함께 전체 진단 메시지를 출력합니다.
활용 팁
정규식을 하드코딩하지 않고 사용자 입력이나 외부 설정값으로 받는 경우에는 반드시 PatternSyntaxException을 catch하여 적절한 안내 메시지를 제공하세요.
복잡한 정규식을 작성할 때는 공식 Pattern API 문서를 참고해 메타문자 규칙을 확인하는 것이 좋습니다.
오류 메시지의 캐럿(^) 위치를 활용하면 긴 정규식에서도 오류 지점을 빠르게 찾아 수정할 수 있습니다.