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)를 사용하면 컴파일 옵션 없이도 동일한 기능을 적용할 수 있습니다.