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

Java 정규식 독립 하위 표현식 (?>re) 완벽 가이드 – 백트래킹 없는 원자적 그룹 매칭

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”가 출력됩니다.