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

Java Pattern.COMMENTS 필드 완벽 가이드 – 예제 코드로 배우는 정규식 주석 활용법

Pattern.COMMENTS 필드란?

Java의 Pattern 클래스가 제공하는 COMMENTS 필드는 정규식 패턴 안에 공백(whitespace)과 주석을 포함할 수 있도록 허용하는 플래그입니다. 이 값을 compile() 메서드에 전달하면, 컴파일 과정에서 패턴 내의 모든 공백은 무시되고 # 기호로 시작하는 주석 역시 행 끝까지 무시됩니다.

이 기능을 활용하면 복잡한 정규식을 여러 줄로 나누고 각 부분에 설명을 덧붙일 수 있어, 코드의 가독성과 유지보수성이 크게 향상됩니다.

예제 1 – 문자열에서 숫자 개수 세기

다음 예제는 입력 문자열에서 숫자를 찾아 그 개수를 출력하는 프로그램입니다. 정규식에 추가된 #ignore this comment 주석과 공백은 모두 무시되므로, 실제 매칭에는 \d만 사용됩니다.

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CommentsExample {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input data: ");
        String input = sc.nextLine();
        // 숫자를 찾기 위한 정규식
        String regex = "\\d #ignore this comment\n";
        // COMMENTS 플래그를 적용하여 정규식 컴파일
        Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
        // Matcher 객체 생성
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        String result = "";
        while (matcher.find()) {
            count++;
            result = result + matcher.group();
        }
        System.out.println("Number of digits in the given text: " + count);
    }
}

실행 결과

Enter input data:
sample1 text2 with3 numbers4 in5 between6
Number of digits in the given text: 6

예제 2 – 생년월일 유효성 검사

COMMENTS 플래그는 길고 복잡한 정규식을 여러 줄로 나누어 작성할 때 특히 유용합니다. 아래 예제는 MM-DD-YYYY 형식의 날짜를 검증하는 정규식을 주석과 함께 단계별로 구분하여 작성한 것입니다.

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CommentsExample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter your name: ");
        String name = sc.nextLine();
        System.out.println("Enter your Date of birth: ");
        String dob = sc.nextLine();
        // MM-DD-YYYY 형식의 날짜를 검사하는 정규식
        String regex = "^(1[0-2]|0[1-9])/
            # 월(Month) 검사\n" + "(3[01]|[12][0-9]|0[1-9])/
            # 일(Date) 검사\n" + "[0-9]{4}$ # 연도(Year) 검사";
        // Pattern 객체 생성
        Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
        // Matcher 객체 생성
        Matcher matcher = pattern.matcher(dob);
        boolean result = matcher.matches();
        if(result) {
            System.out.println("Given date of birth is valid");
        } else {
            System.out.println("Given date of birth is not valid");
        }
    }
}

실행 결과

Enter your name:
Krishna
Enter your Date of birth:
09/26/1989
Given date of birth is valid

참고: 인라인 플래그 (?x)

compile() 메서드에 COMMENTS 플래그를 지정하는 대신, 정규식 내부에 인라인 플래그 (?x)를 삽입하여 동일한 효과를 얻을 수도 있습니다. 예를 들어 "(?x)\\d #주석"처럼 작성하면 해당 패턴에 대해 주석 모드가 활성화됩니다.

정리

  • COMMENTS 플래그를 사용하면 패턴 내의 공백과 #로 시작하는 주석이 모두 무시됩니다.
  • 복잡한 정규식을 여러 줄로 나누어 작성할 수 있어 가독성이 크게 향상됩니다.
  • 인라인 플래그 (?x)를 사용하면 컴파일 옵션 없이도 동일한 기능을 적용할 수 있습니다.