java.util.regex 패키지의 Pattern 클래스는 정규 표현식(regular expression)이 컴파일된 형태를 나타내는 클래스입니다.
이 클래스가 제공하는 compile() 메서드는 정규 표현식을 담은 문자열을 인자로 전달받아, 이를 컴파일한 Pattern 객체를 반환합니다.
컴파일된 Pattern 객체는 matcher() 메서드를 통해 Matcher 객체를 생성하고, 이 Matcher를 이용해 입력 문자열과 정규 표현식의 매칭 여부를 검사할 수 있습니다.
compile() 메서드 기본 예제
다음 예제는 사용자로부터 문자열을 입력받아, 해당 문자열에 숫자가 포함되어 있는지 정규 표현식으로 확인합니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CompileExample {
public static void main(String args[]) {
// 입력 문자열 읽기
Scanner sc = new Scanner(System.in);
System.out.println("Enter input string");
String input = sc.nextLine();
// 숫자를 찾기 위한 정규 표현식
String regex = "(\\d)";
// 정규 표현식 컴파일
Pattern pattern = Pattern.compile(regex);
// 컴파일된 정규 표현식 출력
System.out.println("Compiled regular expression: " + pattern.toString());
// Matcher 객체 가져오기
Matcher matcher = pattern.matcher(input);
// 매칭 결과 확인
if (matcher.find()) {
System.out.println("Given String contains digits");
} else {
System.out.println("Given String does not contain digits");
}
}
}
실행 결과
Enter input string hello my id is 1120KKA Compiled regular expression: (\d) Given String contains digits
위 코드에서 (\d)는 숫자 한 자리를 의미하는 정규 표현식입니다. 입력 문자열에 숫자가 하나라도 포함되어 있으면 find() 메서드가 true를 반환하기 때문에, 문자열에 숫자가 존재하는지 손쉽게 판별할 수 있습니다.
플래그(Flags)와 함께 사용하는 compile()
compile() 메서드의 또 다른 변형은 정수형 플래그 값을 두 번째 인자로 받습니다. 각 플래그는 선택적인 매칭 조건을 지정하며, 예를 들어 CASE_INSENSITIVE 플래그를 사용하면 대소문자를 구분하지 않고 정규 표현식을 컴파일합니다.
다음 예제는 대소문자 구분 없이 문자열 "Tutorialspoint"에서 문자 't'의 개수를 세어 봅니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CompileExample {
public static void main(String args[]) {
// 대소문자 구분 없이 정규 표현식 컴파일
Pattern pattern = Pattern.compile("[t]", Pattern.CASE_INSENSITIVE);
// Matcher 객체 가져오기
Matcher matcher = pattern.matcher("Tutorialspoint");
int count = 0;
while (matcher.find()) {
count++;
}
System.out.println("Number of matches: " + count);
}
}
실행 결과
Number of matches: 3
"Tutorialspoint"에는 대문자 'T'가 1개, 소문자 't'가 2개 포함되어 있습니다. CASE_INSENSITIVE 플래그 덕분에 대소문자를 모두 매칭하여 총 3개가 검출됩니다. 만약 플래그를 지정하지 않으면 대소문자가 구분되어 소문자 't' 2개만 매칭됩니다.
이 밖에도 여러 줄 모드를 활성화하는 MULTILINE, 도트(.)가 줄바꿈 문자까지 포함하도록 하는 DOTALL 등 다양한 플래그가 있으며, 비트 OR(|) 연산자로 여러 플래그를 조합해 사용할 수도 있습니다.