Java Pattern 클래스란?
java.util.regex 패키지의 Pattern 클래스는 정규 표현식(regular expression)이 컴파일된 형태를 나타내는 클래스입니다. 정규 표현식을 실제로 매칭 작업에 사용하려면 먼저 이 클래스를 통해 컴파일해야 합니다.
compile() 메서드
Pattern 클래스의 compile() 메서드는 정규 표현식을 담고 있는 문자열을 인수로 받아 Pattern 객체를 반환합니다. 기본 시그니처는 다음과 같습니다.
static Pattern compile(String regex)
또한 이 메서드에는 플래그(flag)를 나타내는 정수 값을 함께 전달하는 변형 버전도 있습니다. 두 개의 매개변수를 사용하는 시그니처는 아래와 같습니다.
static Pattern compile(String regex, int flags)
Pattern 클래스에서 제공하는 주요 플래그
Pattern 클래스에는 각각 하나의 매칭 옵션을 나타내는 여러 플래그 필드가 정의되어 있습니다. 주요 플래그는 다음과 같습니다.
| 번호 | 플래그 및 설명 |
|---|---|
| 1 | CANON_EQ 두 문자가 정규적으로(canonical) 동등한 경우에만 일치시킵니다. |
| 2 | CASE_INSENSITIVE 대소문자를 구분하지 않고 문자를 일치시킵니다. |
| 3 | COMMENTS 패턴 안에서 공백과 주석(#으로 시작하는 행)을 사용할 수 있도록 허용합니다. |
| 4 | DOTALL dotall 모드를 활성화합니다. 이 모드에서는 “.” 메타 문자가 줄바꿈 문자를 포함한 모든 문자와 일치합니다. |
| 5 | LITERAL 패턴을 리터럴(문자 그대로) 방식으로 해석합니다. 즉, 입력값의 모든 메타 문자와 이스케이프 시퀀스가 일반 문자로 취급됩니다. |
| 6 | MULTILINE 멀티라인 모드를 활성화합니다. 이 모드에서는 “^”와 “$”가 입력 전체가 아닌 각 줄의 시작과 끝에 일치합니다. |
| 7 | UNICODE_CASE 유니코드 기반 대소문자 처리(case folding)를 활성화합니다. CASE_INSENSITIVE와 함께 사용하면 유니코드 문자 검색 시 대소문자 모두 일치됩니다. |
| 8 | UNICODE_CHARACTER_CLASS 사전 정의된 문자 클래스와 POSIX 문자 클래스의 유니코드 버전을 활성화합니다. |
| 9 | UNIX_LINES Unix 라인 모드를 활성화합니다. 줄바꿈 문자로 '\n'만 인식합니다. |
flags() 메서드란?
Pattern 클래스의 flags() 메서드는 현재 패턴을 컴파일할 때 지정된 플래그 값을 반환합니다. 반환되는 값은 해당 플래그에 할당된 정수 상태(bitmask) 값입니다.
예제: COMMENTS 플래그 활용하기
다음 예제는 COMMENTS 플래그를 사용하여 주석이 포함된 정규 표현식으로 생년월일(MM/DD/YYYY 형식)의 유효성을 검사하고, flags() 메서드로 적용된 플래그 값을 출력합니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class COMMENTES_Example {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("이름을 입력하세요: ");
String name = sc.nextLine();
System.out.println("생년월일을 입력하세요(MM/DD/YYYY): ");
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 객체 생성 (COMMENTS 플래그 적용)
Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(dob);
boolean result = matcher.matches();
if(result) {
System.out.println("입력한 생년월일은 유효합니다.");
} else {
System.out.println("입력한 생년월일은 유효하지 않습니다.");
}
System.out.println("적용된 플래그: " + pattern.flags());
}
}
실행 결과
이름을 입력하세요: Krishna 생년월일을 입력하세요(MM/DD/YYYY): 09/26/1989 입력한 생년월일은 유효합니다. 적용된 플래그: 4
실행 결과에서 알 수 있듯이, COMMENTS 플래그가 적용된 패턴은 공백과 주석을 무시하고 정상적으로 날짜 형식을 검사했습니다. 마지막 줄의 “적용된 플래그: 4”는 flags() 메서드가 COMMENTS 플래그의 내부 정수 값인 4를 반환했음을 보여줍니다. 이처럼 flags() 메서드를 활용하면 런타임에 특정 Pattern 객체에 어떤 매칭 옵션이 설정되어 있는지 손쉽게 확인할 수 있습니다.