Matcher 클래스와 toMatchResult() 메서드 소개
java.util.regex.Matcher 클래스는 문자열에 대해 다양한 정규식 매칭 작업을 수행하는 엔진을 나타냅니다. 이 클래스에는 별도의 생성자가 제공되지 않으며, Pattern 클래스의 matcher() 메서드를 사용하여 객체를 생성하거나 얻을 수 있습니다.
toMatchResult() 메서드는 현재 매처(Matcher)의 매칭 상태를 MatchResult 객체 형태로 반환합니다. 반환되는 객체에는 사용 중인 패턴(pattern), 검색 영역(region), 마지막으로 일치한 문자열(lastmatch) 등의 정보가 포함되어 있어 매칭 진행 상황을 손쉽게 파악할 수 있습니다.
주요 특징
- find()로 매칭을 진행하는 동안 각 시점의 매칭 상태를 스냅샷처럼 확인할 수 있습니다.
- reset() 메서드로 입력 문자열을 교체한 후에도 변경된 상태를 그대로 반영하여 반환합니다.
- 반환된 MatchResult 객체의 group(), start(), end() 메서드로 세부 정보를 추가로 조회할 수 있습니다.
예제 1: reset() 전후의 매처 상태 비교
아래 예제는 HTML 문자열에서 볼드(b) 태그 내부의 내용을 정규식으로 찾고, 각 매칭 시점의 매처 상태를 출력한 뒤, reset()으로 새로운 문자열을 설정했을 때 상태가 어떻게 달라지는지 보여줍니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ToMatchResultExample {
public static void main(String[] args) {
String str = "<p>This <b>is</b> an <b>example</b>.</p>";
// 볼드(b) 태그 내용과 일치시키기 위한 정규식
String regex = "<b>(\S+)</b>";
// Pattern 객체 생성
Pattern pattern = Pattern.compile(regex);
// 문자열에 컴파일된 패턴 적용
System.out.println("매처의 상태:");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.toMatchResult());
String result = matcher.group(1);
}
// 새로운 문자열로 매처 리셋
matcher = matcher.reset("<p>this is another <b>line</b>.</p>");
matcher.find();
System.out.println("");
System.out.println("리셋 후 매처의 상태:\n" + matcher.toMatchResult());
}
}
실행 결과
매처의 상태: java.util.regex.Matcher[pattern=<b>(\S+)</b> region=0,40 lastmatch=<b>is</b>] java.util.regex.Matcher[pattern=<b>(\S+)</b> region=0,40 lastmatch=<b>example</b>] 리셋 후 매처의 상태: java.util.regex.Matcher[pattern=<b>(\S+)</b> region=0,35 lastmatch=<b>line</b>]
결과 해석
첫 번째 출력 줄은 <b>is</b>가 마지막으로 일치했을 때의 상태, 두 번째 줄은 <b>example</b>이 일치했을 때의 상태를 보여줍니다. reset()으로 새로운 문자열을 설정한 후에는 검색 영역(region)이 0,35로 변경되고, <b>line</b>이 마지막 일치 항목으로 기록된 것을 확인할 수 있습니다.
예제 2: 사용자 입력에서 특정 문자 찾기
두 번째 예제는 Scanner로 사용자 입력을 받아 입력 문자열에 포함된 # 문자를 모두 찾고, 발견할 때마다 매처의 상태를 출력합니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ToMatchResultExample {
public static void main(String[] args) {
String regex = "[#]";
System.out.println("문자열을 입력하세요:");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
// Pattern 객체 생성
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
System.out.println("매칭 상태:");
// 일치하는 항목 찾기
while (matcher.find()) {
System.out.println(matcher.toMatchResult());
}
}
}
실행 결과
문자열을 입력하세요: #This #is #a #sample #text 매칭 상태: java.util.regex.Matcher[pattern=[#] region=0,26 lastmatch=#] java.util.regex.Matcher[pattern=[#] region=0,26 lastmatch=#] java.util.regex.Matcher[pattern=[#] region=0,26 lastmatch=#] java.util.regex.Matcher[pattern=[#] region=0,26 lastmatch=#] java.util.regex.Matcher[pattern=[#] region=0,26 lastmatch=#]
결과 해석
find()가 # 문자를 하나씩 발견할 때마다 toMatchResult()가 해당 시점의 매칭 상태를 출력합니다. 입력 문자열에 #가 총 5개 포함되어 있으므로 5개의 상태 정보가 순차적으로 출력되었습니다.
참고: toMatchResult()가 반환하는 MatchResult 인터페이스는 group(), groupCount(), start(), end() 등의 메서드를 함께 제공하므로, 필요하다면 일치한 문자열과 그 위치 정보를 더욱 자세하게 활용할 수 있습니다.