Java 정규식에서 하위 표현식(메타문자) (?> re)는 백트래킹(backtracking) 없이 독립적으로 패턴을 매칭하는 특수한 그룹입니다. 이를 원자적 그룹(atomic group)이라고도 부릅니다.
백트래킹이란?
일반적인 정규식 그룹은 매칭에 실패하면 이전에 소비했던 문자를 되돌려 놓고 다른 경로로 다시 시도합니다. 이 과정을 백트래킹이라고 하며, 복잡한 패턴에서는 성능 저하의 주요 원인이 되기도 합니다.
반면 (?> re)로 묶인 그룹은 한 번 매칭에 성공하면 그 결과를 확정해 버립니다. 이후 전체 패턴이 실패하더라도 그룹 내부를 다시 시도하지 않으므로, 매칭 속도가 빨라지고 의도치 않은 백트래킹을 방지할 수 있습니다.
예제 코드
아래 예제는 사용자로부터 문자열을 입력받아, 숫자 하나([0-9])를 독립 하위 표현식으로 매칭하는 프로그램입니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternExample {
public static void main(String args[]) {
// 사용자로부터 문자열 입력 받기
System.out.println("Enter a String");
Scanner sc = new Scanner(System.in);
String input = sc.next();
String regex = "(?>[0-9])";
// 정규식 컴파일
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
// 매칭 여부 확인
boolean bool = matcher.find();
if (bool) {
System.out.print("Match found");
} else {
System.out.print("Match not found");
}
}
}실행 결과
Enter a String 9848022338 Match found
코드 설명
- Pattern.compile(regex): 문자열 형태의 정규식을
Pattern객체로 컴파일합니다. - pattern.matcher(input): 입력 문자열에 대해 매칭을 수행할
Matcher객체를 생성합니다. - matcher.find(): 문자열 전체에서 패턴과 일치하는 부분이 존재하는지 검사하고, 결과를 boolean 값으로 반환합니다.
입력값 9848022338에는 숫자가 포함되어 있으므로 (?>[0-9]) 패턴이 첫 번째 숫자 '9'와 즉시 매칭되어 “Match found”가 출력됩니다.