Java 정규식 수량자란?
정규식(regular expression)을 작성하다 보면 특정 패턴이 몇 번 반복되어야 하는지 지정해야 하는 경우가 자주 발생합니다. 이때 사용하는 것이 바로 수량자(Quantifier)입니다. 수량자는 바로 앞에 위치한 문자, 문자 클래스 또는 그룹이 나타나는 횟수를 제어하는 역할을 합니다.
Java 정규식에서 지원하는 주요 수량자는 다음 표와 같습니다.
| 수량자 | 설명 | 예시 |
|---|---|---|
| re* | 0회 이상 반복 (없어도 됨) | [0-9]* : 0개 이상의 숫자와 일치 |
| re? | 0회 또는 1회만 등장 | [0-9]? : 0개 또는 1개의 숫자와 일치 |
| re+ | 1회 이상 반복 (반드시 1번은 등장) | [0-9]+ : 1개 이상의 숫자와 일치 |
| re{n} | 정확히 n회 반복 | [0-9]{3} : 정확히 3자리 숫자와 일치 |
| re{n} | 최소 n회 이상 반복 | [0-9]{3} : 최소 3자리 이상의 숫자와 일치 |
| re{n, m} | 최소 n회, 최대 m회 반복 | [0-9]{2, 5} : 2자리에서 5자리 사이의 숫자와 일치 |
참고: 탐욕적(Greedy) 수량자
위 표의 수량자들은 기본적으로 탐욕적(greedy) 방식으로 동작합니다. 즉, 가능한 한 가장 많은 문자를 매칭하려고 시도합니다. 만약 최소한의 문자만 매칭하고 싶다면 수량자 뒤에 ?를 붙여 게으른(reluctant) 방식으로 변경할 수 있습니다. 예를 들어 [0-9]+?는 가능한 한 적은 개수의 숫자만 매칭합니다.
예제 코드
아래 예제는 사용자로부터 5개의 문자열을 입력받은 후, 정규식 [0-9]{3,6}(3자리 이상 6자리 이하의 숫자)과 일치하는 값만 출력하는 프로그램입니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
String regex = "[0-9]{3,6}";
Scanner sc = new Scanner(System.in);
System.out.println("Enter 5 input strings: ");
String input[] = new String[5];
for (int i = 0; i < 5; i++) {
input[i] = sc.nextLine();
}
// Pattern 객체 생성
Pattern p = Pattern.compile(regex);
System.out.println("Matched values: ");
for (int i = 0; i < 5; i++) {
// Matcher 객체 생성
Matcher m = p.matcher(input[i]);
if (m.matches()) {
System.out.println(m.group() + ": accepted ");
}
}
}
}실행 결과
Enter 5 input strings: 12 154 4587 478365 4578952 Matched values: 154: accepted 4587: accepted 478365: accepted
결과 분석
입력된 5개의 값을 살펴보면 결과를 쉽게 이해할 수 있습니다.
- 12 → 2자리 숫자이므로 최소 3자리 조건을 충족하지 못해 탈락합니다.
- 154, 4587, 478365 → 각각 3자리, 4자리, 6자리 숫자로
{3,6}범위에 해당하므로 매칭에 성공합니다. - 4578952 → 7자리 숫자이므로 최대 6자리 조건을 초과하여 탈락합니다.
이처럼 수량자를 활용하면 문자열의 길이나 반복 횟수를 손쉽게 검증할 수 있으며, 전화번호, 우편번호, 비밀번호 형식 검사 등 실무에서 매우 유용하게 활용됩니다.