탐욕적(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]+?)를 붙여 동작 방식을 변경할 수 있습니다.