Java에서 정규식 메타 문자(^, $, [] 등)를 특별한 의미 없이 일반 문자 그대로 매칭해야 할 때가 있습니다. 이럴 때 Pattern 클래스의 LITERAL> 필드를 활용하면 간단하게 해결할 수 있습니다.
compile() 메서드의 매개변수
Pattern 클래스의 compile() 메서드는 다음 두 가지 매개변수를 받습니다.
- 정규식을 나타내는 문자열(String) 값
Pattern클래스에 정의된 필드 중 하나인 정수(int) 형태의 플래그 값
Pattern.LITERAL 플래그란?
LITERAL 필드를 사용하면 패턴이 리터럴(literal) 방식으로 해석됩니다. 즉, 정규식의 모든 메타 문자와 이스케이프 시퀀스가 더 이상 특별한 의미를 갖지 않고, 단순한 일반 문자로 취급됩니다.
따라서 정규식 메타 문자를 일반 문자처럼 매칭하고 싶다면, compile() 메서드 호출 시 정규식과 함께 Pattern.LITERAL을 플래그 값으로 전달하면 됩니다.
예제 코드
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
System.out.println("Enter input data: ");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String regex = "^[0-9]";
// Pattern 객체 생성
Pattern pattern = Pattern.compile(regex, Pattern.LITERAL);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
int count = 0;
while(matcher.find()) {
count++;
System.out.println(matcher.group());
}
System.out.println("Number of matches: "+count);
}
}실행 결과 1
일반적인 숫자 입력의 경우, ^[0-9]는 리터럴 문자열로 해석되므로 일치하는 부분이 없습니다.
Enter input data: 9848022338 Number of matches: 0
실행 결과 2
입력값이 정확히 ^[0-9]라면, 메타 문자가 아닌 일반 문자열로 매칭되어 1건의 일치 결과를 얻습니다.
Enter input data: ^[0-9] ^[0-9] Number of matches: 1
정리
Pattern.LITERAL 플래그를 사용하면 정규식 문법을 무시하고 패턴 전체를 순수한 문자열로 취급합니다. 사용자 입력에 포함된 특수 문자를 안전하게 검색해야 하거나, 정규식 기능 없이 단순 문자열 매칭이 필요한 경우에 유용하게 활용할 수 있습니다.