명명된 캡처 그룹이란?
정규식의 명명된 캡처 그룹(Named Capturing Group)은 각 그룹에 고유한 이름을 부여하여, 번호 대신 이름으로 그룹을 참조할 수 있게 해주는 기능입니다. 일반적인 캡처 그룹은 인덱스 번호로 접근해야 하기 때문에 그룹이 많아지면 코드를 파악하기 어려워지지만, 이름을 사용하면 코드의 가독성과 유지보수성이 크게 향상됩니다.
Java는 SE7(Java 7)부터 정규식에서 캡처 그룹을 지원하기 시작했습니다.
문법
명명된 캡처 그룹은 다음과 같은 형식으로 정의합니다.
(?<그룹이름>패턴)
매칭 결과는 Matcher 객체의 group("그룹이름") 메서드를 호출하여 해당 그룹에 매칭된 문자열을 가져올 수 있습니다.
예제 코드
다음 예제는 전화번호 형식의 입력 문자열에서 국가 코드, 지역 코드, 전화 번호를 각각 명명된 그룹으로 추출하는 프로그램입니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ReplaceAll{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
String regex = "(?<globalCode>[\d]{2})-(?<nationalCode>[\d]{5})-(?<number>[\d]{6})";
// 패턴 객체 생성
Pattern pattern = Pattern.compile(regex);
// 컴파일된 패턴을 입력 문자열과 매칭
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("Global code: "+matcher.group("globalCode"));
System.out.println("National code: "+matcher.group("nationalCode"));
System.out.println("Phone number: "+matcher.group("number"));
}
}
}정규식 패턴 분석
(?<globalCode>[\d]{2})— 두 자리 숫자를 globalCode라는 이름의 그룹으로 캡처합니다.(?<nationalCode>[\d]{5})— 다섯 자리 숫자를 nationalCode라는 이름의 그룹으로 캡처합니다.(?<number>[\d]{6})— 여섯 자리 숫자를 number라는 이름의 그룹으로 캡처합니다.
실행 결과
Enter input text: 91-08955-224558 Global code: 91 National code: 08955 Phone number: 224558
마무리
이처럼 명명된 캡처 그룹을 활용하면 복잡한 정규식에서도 어떤 값이 어느 그룹에 해당하는지 직관적으로 알 수 있어, 실수를 줄이고 협업 시 코드 이해도를 높일 수 있습니다. 특히 날짜, 전화번호, 이메일 등 구조화된 데이터를 파싱할 때 매우 유용하게 사용됩니다.