java.util.regex.MatchResult 인터페이스는 정규식 매칭 결과를 조회할 수 있는 다양한 메서드를 제공합니다.
이 인터페이스의 객체는 Matcher 클래스의 toMatchResult() 메서드를 통해 얻을 수 있습니다. 이 메서드는 현재 매처(matcher)의 매칭 상태를 나타내는 MatchResult 객체를 반환합니다.
인터페이스가 제공하는 end(int group) 메서드는 특정 그룹을 나타내는 정수를 인자로 받으며, 해당 그룹에서 마지막으로 일치가 발생한 위치 바로 뒤의 오프셋(offset)을 반환합니다.
동작 방식
정규식 패턴에 캡처 그룹이 포함되어 있으면, 각 그룹은 번호(1부터 시작)로 구분됩니다. end(int group)에 그룹 번호를 전달하면 해당 그룹이 입력 문자열에서 마지막으로 일치를 마친 인덱스 + 1 값이 반환됩니다. 만약 매칭이 아직 수행되지 않았거나 지정한 그룹이 존재하지 않으면 IllegalStateException 또는 IndexOutOfBoundsException이 발생할 수 있으므로 주의해야 합니다.
예제
import java.util.Scanner;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
String regex = "(.*)(\\d+)(.*)";
// 사용자로부터 입력 받기
Scanner sc = new Scanner(System.in);
System.out.println("입력 텍스트를 입력하세요: ");
String input = sc.nextLine();
// Pattern 클래스 인스턴스 생성
Pattern pattern = Pattern.compile(regex);
// Matcher 클래스 인스턴스 생성
Matcher matcher = pattern.matcher(input);
// 매칭 여부 확인
if (matcher.find()) {
System.out.println("매칭 발견");
}
MatchResult res = matcher.toMatchResult();
int end = res.end(1);
System.out.println(end);
}
}
코드 설명
위 예제에서 사용된 정규식 (.*)(\d+)(.*)는 세 개의 캡처 그룹으로 구성되어 있습니다. 첫 번째 그룹 (.*)는 숫자 앞까지의 모든 문자를, 두 번째 그룹 (\d+)는 하나 이상의 연속된 숫자를, 세 번째 그룹 (.*)는 나머지 문자를 캡처합니다.
res.end(1)은 첫 번째 그룹의 매칭이 끝난 직후의 오프셋을 반환하므로, 입력 문자열에서 숫자가 시작되기 직전의 위치 + 1 값과 같습니다.
실행 결과
입력 텍스트를 입력하세요: This is a sample Text, 123 매칭 발견 25
입력 문자열 "This is a sample Text, 123"에서 첫 번째 그룹 (.*)는 숫자 "123" 앞부분인 "This is a sample Text, "까지 매칭되며, 이 부분의 길이가 24이므로 end(1)은 25를 반환합니다.