Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java Matcher toMatchResult() 메서드 완벽 정리 - 예제 코드로 배우기


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() 등의 메서드를 함께 제공하므로, 필요하다면 일치한 문자열과 그 위치 정보를 더욱 자세하게 활용할 수 있습니다.