Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 정규식 그룹화 구문(Grouping Constructs) 완벽 정리

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. 역추적 방지 그룹 (?> )
일단 일치하면 내부에서 역추적을 허용하지 않습니다. 불필요한 백트래킹을 줄여 성능을 개선할 수 있지만, 과도하게 사용하면 의도한 일치를 놓칠 수 있으므로 주의가 필요합니다.