Java 정규식의 \G 메타문자란?
정규식에서 하위 표현식(subexpression)이자 메타문자인 \G는 마지막 일치(match)가 종료된 지점을 나타냅니다. 즉, 이전 매칭 작업이 끝난 바로 그 위치부터 새로운 매칭을 시도할 때 사용됩니다.
일반적인 앵커(anchor)인 ^(문자열 시작)나 $(문자열 끝)와 달리, \G는 매칭이 반복적으로 수행되는 상황에서 특히 유용합니다. 연속된 패턴을 찾거나, 문자열의 특정 구간만 순차적으로 처리해야 할 때 \G를 활용하면 중간에 다른 문자가 끼어들 경우 매칭이 자동으로 중단되도록 만들 수 있습니다.
\G의 동작 원리
\G는 다음과 같은 방식으로 동작합니다.
- 첫 번째 매칭 시도에서는 문자열의 시작 위치(또는 이전 매칭이 없는 경우 현재 검색 시작 지점)에서 매칭됩니다.
- 이후 매칭 시도에서는 반드시 직전 매칭이 끝난 위치에서만 성공합니다.
- 직전 매칭 종료 지점과 패턴이 일치하지 않으면 더 이상 매칭이 진행되지 않습니다.
예를 들어, 패턴 \G[0-9]를 사용하면 문자열에서 연속된 숫자만 추출할 수 있습니다. 숫자 뒤에 공백이나 다른 문자가 등장하는 순간 매칭이 멈추기 때문입니다.
예제 코드
다음은 \G 메타문자를 사용하여 입력 문자열에서 연속된 숫자를 찾아내고, 매칭된 개수를 출력하는 Java 프로그램입니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String args[]) {
String regex = "\\G[0-9]";
Scanner sc = new Scanner(System.in);
System.out.println("Enter a string: ");
String input = sc.nextLine();
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
int count = 0;
System.out.println("Digits in the previous match:");
while (m.find()) {
System.out.print(m.group());
count++;
}
System.out.println();
System.out.println("Number of matches: " + count);
}
}코드 설명
"\\G[0-9]": \G 앵커와 숫자 클래스 [0-9]를 결합한 정규식 패턴입니다. 자바 문자열에서 역슬래시는 이스케이프해야 하므로\\G로 작성합니다.Pattern.compile(regex): 정규식을 컴파일하여 Pattern 객체를 생성합니다.m.find(): 입력 문자열에서 패턴과 일치하는 부분을 순차적으로 탐색합니다. \G 덕분에 이전 매칭이 끝난 지점에서만 다음 매칭이 시도됩니다.m.group(): 매칭된 실제 문자열을 반환합니다.
실행 결과
Enter a string: 555 sample text Digits in the previous match: 555 Number of matches: 3
결과 분석
입력 문자열 555 sample text에서 패턴 \G[0-9]는 다음과 같이 동작합니다.
- 첫 번째 매칭: 문자열 시작 위치에서 '5'가 발견되어 매칭됩니다.
- 두 번째 매칭: 직전 매칭이 끝난 위치에서 '5'가 발견되어 매칭됩니다.
- 세 번째 매칭: 같은 방식으로 세 번째 '5'까지 매칭됩니다.
- 네 번째 시도: 직전 매칭 종료 지점이 공백이므로 [0-9]와 일치하지 않아 매칭이 종료됩니다.
그 결과 연속된 숫자 555만 추출되며, 총 매칭 횟수는 3이 됩니다. 공백 이후의 "sample text"는 매칭 대상에서 제외됩니다.
정리
\G 메타문자는 마지막 매칭 종료 지점을 기준으로 매칭을 이어가는 강력한 도구입니다. CSV 파싱, 토큰화, 연속된 패턴 검증 등 이전 매칭 결과와의 연속성이 중요한 상황에서 활용하면 코드를 간결하고 안전하게 작성할 수 있습니다.