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

Java 정규식의 탐욕적(Greedy) 수량자 완벽 정리

탐욕적(Greedy) 수량자란?

탐욕적 수량자는 Java 정규식에서 기본값으로 적용되는 수량자입니다. 탐욕적 수량자는 입력 문자열에서 가능한 한 가장 많은 부분, 즉 가장 긴 매칭(longest match)을 찾으려고 시도합니다. 만약 매칭에 실패하면 마지막 문자 하나를 제외한 상태에서 다시 매칭을 시도하며, 이 과정을 성공할 때까지 반복합니다.

대표적인 탐욕적 수량자는 다음과 같습니다.

수량자설명
re*0번 이상의 반복을 매칭합니다.
re?0번 또는 1번의 등장을 매칭합니다.
re+1번 이상의 반복을 매칭합니다.
re{n}정확히 n번의 등장을 매칭합니다.
re{n}최소 n번 이상의 등장을 매칭합니다.
re{n, m}최소 n번, 최대 m번의 등장을 매칭합니다.

예제 코드

다음 Java 예제에서는 1개 이상의 숫자를 매칭해 보겠습니다. 입력 문자열이 45545일 때, 사실 4, 45, 455 등도 모두 조건에 부합하는 값입니다. 하지만 탐욕적 수량자인 [0-9]+를 사용했기 때문에 가장 길게 매칭 가능한 전체 문자열이 결과로 반환됩니다.

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

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input text: ");
        String input = sc.nextLine();
        String regex = "[0-9]+";
        // 패턴 객체 생성
        Pattern pattern = Pattern.compile(regex);
        // 컴파일된 패턴을 문자열에 매칭
        Matcher matcher = pattern.matcher(input);
        System.out.println("Matched text: ");
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

실행 결과

Enter input text:
45545
Matched text:
45545

실행 결과를 보면, 여러 후보 값 중에서 탐욕적 수량자가 45545라는 가장 긴 문자열 전체를 한 번에 매칭한 것을 확인할 수 있습니다. 만약 최소 매칭(비탐욕적, lazy) 방식을 원한다면 수량자 뒤에 ?(예: [0-9]+?)를 붙여 동작 방식을 변경할 수 있습니다.