Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java) PatternSyntaxException 클래스 완벽 정리 – 정규식 문법 오류 처리 방법

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 문서를 참고해 메타문자 규칙을 확인하는 것이 좋습니다.

  • 오류 메시지의 캐럿(^) 위치를 활용하면 긴 정규식에서도 오류 지점을 빠르게 찾아 수정할 수 있습니다.