C# 정규식 수량자(Quantifier)란?
C# 정규식에서 수량자(quantifier)는 앞의 요소(문자, 그룹 또는 문자 클래스)가 입력 문자열에서 몇 번 나타나야 일치(match)로 인정되는지를 지정하는 메타 문자입니다. 수량자를 활용하면 반복되는 패턴을 간결하고 효율적으로 표현할 수 있습니다.
기본 수량자
아래 표는 C# 정규식에서 가장 널리 사용되는 기본 수량자들을 정리한 것입니다.
| 수량자 | 설명 | 패턴 | 일치 결과 |
|---|---|---|---|
| * | 이전 요소와 0번 이상 일치합니다. | \d*\.\d | ".0", "19.9", "219.9" |
| + | 이전 요소와 1번 이상 일치합니다. | "be+" | "been"의 "bee", "bent"의 "be" |
| ? | 이전 요소와 0번 또는 1번 일치합니다. | "rai?n" | "ran", "rain" |
| { n } | 이전 요소와 정확히 n번 일치합니다. | ",\d{3}" | "1,043.6"의 ",043", "9,876,543,210"의 ",876", ",543", ",210" |
| { n } | 이전 요소와 최소 n번 일치합니다. | "\d{2}" | "166", "29", "1930" |
| { n , m } | 이전 요소와 최소 n번, 최대 m번 일치합니다. | "\d{3,5}" | "166", "17668", "193024"의 "19302" |
지연(Lazy) 수량자
기본 수량자는 가능한 한 많은 문자를 찾으려는 탐욕적(greedy) 방식으로 동작합니다. 반면, 수량자 뒤에 물음표(?)를 붙인 지연(lazy) 수량자는 가능한 한 적은 횟수만큼만 일치시킵니다.
| 수량자 | 설명 | 패턴 | 일치 결과 |
|---|---|---|---|
| *? | 이전 요소와 0번 이상 일치하되, 가능한 한 적게 일치합니다. | \d*?\.\d | ".0", "19.9", "219.9" |
| +? | 이전 요소와 1번 이상 일치하되, 가능한 한 적게 일치합니다. | "be+?" | "been"의 "be", "bent"의 "be" |
| ?? | 이전 요소와 0번 또는 1번 일치하되, 가능한 한 적게 일치합니다. | "rai??n" | "ran", "rain" |
| { n }? | 이전 요소와 정확히 n번 일치합니다. | ",\d{3}?" | "1,043.6"의 ",043", "9,876,543,210"의 ",876", ",543", ",210" |
| { n }? | 이전 요소와 최소 n번 일치하되, 가능한 한 적게 일치합니다. | "\d{2}?" | "166", "29", "1930" |
| { n , m }? | 이전 요소와 n번 이상 m번 이하로 일치하되, 가능한 한 적게 일치합니다. | "\d{3,5}?" | "166", "17668", "193024"의 "193", "024" |
탐욕적 수량자와 지연 수량자의 차이
예를 들어 문자열 "193024"에 패턴 \d{3,5}를 적용하면 탐욕적 수량자는 최대 길이인 5자리 "19302"를 반환하지만, 지연 수량자 \d{3,5}?는 최소 조건인 3자리씩 "193"과 "024"로 나누어 일치시킵니다. 이처럼 매칭 목적에 맞게 탐욕적 수량자와 지연 수량자를 적절히 선택하는 것이 정확한 정규식 작성의 핵심입니다.