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

Java Matcher group() 메서드 완벽 정리 – 예제 코드와 함께 배우기

java.util.regex.Matcher 클래스는 다양한 매칭(match) 작업을 수행하는 엔진 역할을 하는 클래스입니다. 이 클래스에는 별도의 생성자가 정의되어 있지 않으며, java.util.regex.Pattern 클래스의 matcher() 메서드를 호출하여 객체를 생성하거나 얻을 수 있습니다.


Matcher 클래스의 group() 메서드는 마지막으로 수행된 매칭 작업에서 일치한 입력 부분 문자열을 반환합니다. 즉, find() 또는 matches()로 패턴 매칭에 성공한 후에 호출해야 하며, 매칭이 수행되지 않은 상태에서 호출하면 IllegalStateException이 발생합니다.


예제 1: 기본 group() 메서드 사용하기

다음 예제는 HTML 문자열에서 굵게(<b>) 또는 기울임(<i>) 처리된 단어를 정규식으로 찾아 출력합니다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GroupExample {
    public static void main(String[] args) {
        String str = "<p>This <b>is</b> an <b>example</b> HTML <b>script</b> "
                + "where <b>every</b> alternative <b>word</b> is <b>bold</b>. "
                + "It <i>also</i> contains <i>italic</i> words</p>";

        // b, i 태그 내부의 내용을 찾기 위한 정규식
        String regex = "<b>(\\S+)</b>|<i>(\\S+)</i>";

        // Pattern 객체 생성
        Pattern pattern = Pattern.compile(regex);

        // 대상 문자열에서 컴파일된 패턴과 매칭 수행
        Matcher matcher = pattern.matcher(str);

        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

실행 결과

<b>is</b>
<b>example</b>
<b>script</b>
<b>every</b>
<b>word</b>
<b>bold</b>
<i>also</i>
<i>italic</i>

실행 결과에서 볼 수 있듯이, 인자 없이 호출된 group()은 매칭에 성공한 전체 부분 문자열을 그대로 반환합니다.


예제 2: 캡처 그룹 인덱스로 group(int group) 사용하기

group() 메서드에는 정수형 매개변수를 받는 변형도 있습니다. 캡처 그룹(capturing group)은 정규식에서 여는 괄호 '('의 순서대로 왼쪽에서 오른쪽 방향으로 1부터 번호가 매겨지며, group(0)은 항상 전체 매칭 결과를 의미합니다.


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GroupTest {
    public static void main(String[] args) {
        String regex = "(.*)(\\d+)(.*)";
        String input = "This is a sample Text, 1234, with numbers in between.";

        // Pattern 객체 생성
        Pattern pattern = Pattern.compile(regex);

        // 대상 문자열에서 컴파일된 패턴과 매칭 수행
        Matcher matcher = pattern.matcher(input);

        if (matcher.find()) {
            System.out.println("match: " + matcher.group(0));
            System.out.println("First group match: " + matcher.group(1));
            System.out.println("Second group match: " + matcher.group(2));
            System.out.println("Third group match: " + matcher.group(3));
        }
    }
}

실행 결과

match: This is a sample Text, 1234, with numbers in between.
First group match: This is a sample Text, 123
Second group match: 4
Third group match: , with numbers in between.

핵심 정리

  • group(): 마지막 매칭에서 일치한 전체 문자열을 반환합니다.
  • group(int group): 지정한 인덱스의 캡처 그룹에 해당하는 문자열을 반환합니다. 인덱스는 1부터 시작하며, 0은 전체 매칭을 나타냅니다.
  • 매칭에 성공한 이후에만 호출할 수 있으며, 그렇지 않으면 IllegalStateException이 발생합니다.

참고로 예제 2에서 첫 번째 그룹이 "This is a sample Text, 123"을 캡처한 이유는 (.*)가 탐욕적(greedy)으로 동작하여 가능한 한 많은 문자를 소비하려 하기 때문입니다. 그 결과 숫자 중 마지막 한 글자만 두 번째 그룹인 (\d+)에 남게 됩니다.