C# 정규식의 그룹화 구문(Grouping Constructs)이란?
정규식(Regular Expression)을 작성할 때는 문자, 연산자, 구문 등 다양한 범주의 요소를 조합하여 원하는 패턴을 정의합니다. 그중 하나가 바로 그룹화 구문(Grouping Constructs)입니다.
그룹화 구문은 정규식 내부의 하위 식(sub-expression)을 묶어 표현하고, 입력 문자열에서 해당 패턴과 일치하는 부분 문자열을 캡처하는 역할을 합니다. 아래 표는 C#(.NET) 정규식에서 사용할 수 있는 주요 그룹화 구문을 정리한 것입니다.
그룹화 구문 종류
| 그룹화 구문 | 설명 | 패턴 | 일치 예시 |
|---|---|---|---|
| ( 하위식 ) | 일치한 하위식을 캡처하고, 0부터 시작하는 서수(ordinal number)를 부여합니다. | (\w)\1 | "deep"의 "ee" |
| (?<name>하위식) | 일치한 하위식을 이름이 지정된 그룹(named group)으로 캡처합니다. | (?<double>\w)\k<double> | "deep"의 "ee" |
| (?<name1-name2>하위식) | 균형 조정 그룹(balancing group) 정의를 나타냅니다. | (((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$ | "3+2^((1-3)*(3-1))"의 "((1-3)*(3-1))" |
| (?:하위식) | 캡처하지 않는 그룹(noncapturing group)을 정의합니다. | Write(?:Line)? | "Console.WriteLine()"의 "WriteLine" |
| (?imnsx-imnsx:하위식) | 하위식 내에서 지정된 옵션을 적용하거나 해제합니다. | A\d{2}(?i:\w+)\b | "A12xl A12XL a12xl"의 "A12xl", "A12XL" |
| (?=하위식) | 너비가 0인 긍정 전방 탐색(positive lookahead) 어설션입니다. | \w+(?=\.) | "He is. The dog ran. The sun is out."의 "is", "ran", "out" |
| (?!하위식) | 너비가 0인 부정 전방 탐색(negative lookahead) 어설션입니다. | \b(?!un)\w+\b | "unsure sure unity used"의 "sure", "used" |
| (?<=하위식) | 너비가 0인 긍정 후방 탐색(positive lookbehind) 어설션입니다. | (?<=19)\d{2}\b | "1851 1999 1950 1905 2003"의 "99", "50", "05" |
| (?<!하위식) | 너비가 0인 부정 후방 탐색(negative lookbehind) 어설션입니다. | (?<!19)\d{2}\b | "1851 1999 1950 1905 2003"의 "51", "03" |
| (?>하위식) | 역추적(backtracking)을 수행하지 않는 원자적(atomic) 하위식입니다. | [13579](?>A+B+) | "1ABB 3ABBC 5AB 5AC"의 "1ABB", "3ABB", "5AB" |
주요 그룹화 구문 활용 포인트
1. 기본 캡처 그룹 ( )
괄호로 묶인 하위식은 자동으로 캡처되며, 왼쪽 괄호 순서대로 번호가 매겨집니다. 예제의 (\w)\1은 임의의 단어 문자를 캡처한 뒤 \1로 동일한 문자가 반복되는 경우를 찾아 "deep"에서 "ee"를 검출합니다.
2. 명명된 그룹 (?<name>)
번호 대신 의미 있는 이름으로 그룹을 참조할 수 있어 복잡한 정규식의 가독성과 유지보수성이 크게 향상됩니다.
3. 균형 조정 그룹
여는 괄호와 닫는 괄호처럼 짝을 이루는 구조를 검사할 때 유용하며, 중첩된 구조를 처리하는 데 활용됩니다.
4. 비캡처 그룹 (?: )
여러 식을 묶기만 할 뿐 캡처를 수행하지 않으므로, 불필요한 캡처로 인한 성능 저하와 그룹 번호 혼란을 방지할 수 있습니다.
5. 전방/후방 탐색 어설션
(?= ), (?! ), (?<= ), (?<! )는 문자열을 실제로 소비(consume)하지 않고 특정 패턴의 존재 여부만 확인하므로, 위치 조건 검사에 적합합니다.
6. 역추적 방지 그룹 (?> )
일단 일치하면 내부에서 역추적을 허용하지 않습니다. 불필요한 백트래킹을 줄여 성능을 개선할 수 있지만, 과도하게 사용하면 의도한 일치를 놓칠 수 있으므로 주의가 필요합니다.