Matcher 클래스란?
java.util.regex 패키지의 Matcher 클래스는 정규 표현식을 기반으로 다양한 매칭(match) 작업을 수행하는 엔진 역할을 합니다. 이 클래스는 별도의 생성자를 제공하지 않으며, 대신 java.util.regex.Pattern 클래스의 matcher() 메서드를 호출하여 객체를 생성할 수 있습니다.
usePattern() 메서드란?
Matcher 클래스의 usePattern() 메서드는 새로운 정규 표현식 패턴을 나타내는 Pattern 객체를 인수로 받아, 기존에 사용하던 패턴을 새로운 패턴으로 교체한 뒤 해당 패턴으로 매칭을 수행합니다. 하나의 Matcher 객체로 여러 패턴을 순차적으로 적용해야 할 때 유용하게 활용할 수 있습니다.
주요 특징
- 기존 Matcher 객체의 상태(매칭 위치 등)는 초기화되지 않고 그대로 유지됩니다.
- 새 Pattern 객체를 인수로 전달받아 현재 Matcher에 적용합니다.
- 반환값으로 자기 자신(Matcher)을 반환하므로 메서드 체이닝이 가능합니다.
예제 코드
다음 예제는 입력된 문자열에서 특수 문자의 개수를 세고, 이후 usePattern() 메서드를 사용해 새로운 패턴으로 전환하여 문자열 길이 조건을 검사합니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class UsePatternExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
String regex = "[#%&*]";
// Pattern 객체 생성
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
count++;
}
// 첫 번째 패턴으로 찾은 결과 출력
System.out.println("The are " + count + " special characters [# % & *] in the given text");
// 6~15자 길이를 검사하는 새로운 패턴 생성
Pattern newPattern = Pattern.compile("\\A(?=\\w{6,15}\\z)");
// usePattern()으로 새 패턴으로 전환
matcher = matcher.usePattern(newPattern);
if (matcher.find()) {
System.out.println("Given input contain 6 to 15 characters");
} else {
System.out.println("Given input doesn't contain 6 to 15 characters");
}
}
}실행 결과
Enter input text: #*mypassword& The are 3 special characters [# % & *] in the given text !!mypassword! Given input doesn't contain 6 to 15 characters
예제 해설
위 코드의 실행 흐름을 단계별로 살펴보면 다음과 같습니다.
- 특수 문자 검사: 정규식
[#%&*]을 사용해 입력 문자열에서 #, %, &, * 문자가 몇 번 나타나는지 계산합니다. 입력값#*mypassword&에는 특수 문자가 3개 포함되어 있습니다. - 패턴 전환:
usePattern()메서드를 호출하여 길이 검증용 패턴\A(?=\w{6,15}\z)로 교체합니다. 이 패턴은 문자열 전체가 6자 이상 15자 이하의 단어 문자로만 구성되어 있는지 확인합니다. - 결과 확인: 입력값에는 느낌표(!) 같은 특수 문자가 포함되어 있어
\w조건에 맞지 않으므로, "6~15자 조건을 만족하지 않는다"는 메시지가 출력됩니다.
이처럼 usePattern() 메서드를 활용하면 Matcher 객체를 새로 생성하지 않고도 기존 객체에 다양한 정규 표현식 패턴을 재적용할 수 있어 코드의 효율성과 가독성을 높일 수 있습니다.