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

예제로 배우는 Java Matcher groupCount() 메서드 완벽 가이드


java.util.regex.Matcher 클래스는 문자열에 대해 다양한 매칭 작업을 수행하는 엔진을 나타냅니다. 이 클래스에는 공개된 생성자가 없으며, java.util.regex.Pattern 클래스의 matcher() 메서드를 사용해 객체를 얻을 수 있습니다.

Matcher 클래스의 groupCount() 메서드는 현재 정규 표현식 패턴에 정의된 캡처링 그룹(capturing group)의 개수를 계산하여 반환합니다.

groupCount() 메서드의 주요 특징

  • 정규 표현식에서 소괄호 ()로 묶인 부분이 하나의 캡처링 그룹입니다.
  • 매칭된 전체 결과를 의미하는 그룹 0(group(0))은 개수에 포함되지 않습니다.
  • 반환 타입은 int이며, 캡처링 그룹이 없으면 0을 반환합니다.
  • 실제 매칭 성공 여부와 관계없이 패턴에 정의된 그룹의 총개수를 반환합니다.

예제 1: 기본 사용법

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.compile(regex);
        // 컴파일된 패턴을 입력 문자열과 매칭
        Matcher matcher = pattern.matcher(input);
        if (matcher.find()) {
            System.out.println("첫 번째 그룹 매치: " + matcher.group(1));
            System.out.println("두 번째 그룹 매치: " + matcher.group(2));
            System.out.println("세 번째 그룹 매치: " + matcher.group(3));
            System.out.println("캡처링 그룹 수: " + matcher.groupCount());
        }
    }
}

위 예제의 정규 표현식 (.*)(\d+)(.*)는 세 개의 캡처링 그룹으로 구성되어 있습니다. 첫 번째 그룹 (.*)는 숫자 앞부분을, 두 번째 그룹 (\d+)는 마지막 숫자를, 세 번째 그룹 (.*)는 나머지 문자열을 각각 캡처합니다.

출력 결과

첫 번째 그룹 매치: This is a sample Text, 123
두 번째 그룹 매치: 4
세 번째 그룹 매치: , with numbers in between.
캡처링 그룹 수: 3

정규 표현식의 기본 동작인 탐욕적(greedy) 매칭 때문에 첫 번째 그룹이 가능한 한 많은 문자를 가져가므로, 숫자 "1234" 중 "123"은 첫 번째 그룹에, 마지막 "4"만 두 번째 그룹에 포함됩니다.

예제 2: 반복 매칭에서 활용하기

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

public class Test {
    public static void main(String[] args) {
        // t로 시작하고 t로 끝나는 단어를 찾는 정규 표현식
        String regex = "(t(\\S+)t)(\\s)";
        String str = "the words tit tat tweet tostff tact that tilt text start and end wit the letter t ";
        // 패턴 객체 생성
        Pattern pattern = Pattern.compile(regex);
        // 컴파일된 패턴을 입력 문자열과 매칭
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            System.out.println(matcher.group(0));
        }
        System.out.println("총 캡처링 그룹 수: " + matcher.groupCount());
    }
}

이 예제는 while 루프와 find() 메서드를 사용해 문자열에서 조건에 맞는 모든 단어를 반복적으로 찾아낸 뒤, 마지막에 groupCount()로 전체 캡처링 그룹 개수를 출력합니다.

출력 결과

tit
tat
tweet
tact
that
tilt
text
tart
총 캡처링 그룹 수: 3

정리

groupCount() 메서드는 복잡한 정규 표현식을 다룰 때 패턴 내 그룹 구조를 파악하는 데 유용합니다. 단, 이 메서드는 그룹의 개수만 알려줄 뿐 실제 매칭된 값을 반환하지 않으므로, 각 그룹의 값이 필요하다면 group(int) 메서드를 함께 사용해야 합니다.