C# 정규식 앵커(Anchor)란?
C#의 정규식에서 앵커(anchor)는 문자열 안의 특정 '위치'를 기준으로 매칭의 성공 여부를 결정하는 특수 구문입니다. 앵커는 실제 문자를 소비(consume)하지 않고, 현재 위치가 문자열의 시작·끝 또는 단어 경계 같은 조건에 부합하는지만 검사합니다. 덕분에 패턴이 문자열의 어느 지점에서 일치해야 하는지를 정밀하게 제어할 수 있습니다.
주요 앵커 종류
아래 표는 C# 정규식에서 사용할 수 있는 대표적인 앵커와 각각의 동작 방식을 정리한 것입니다.
| 어설션 | 설명 | 패턴 | 일치 예 |
|---|---|---|---|
| ^ | 매치는 문자열 또는 줄(line)의 시작 부분에서 시작되어야 합니다. | ^\d{3} | "567-777-"에서 "567" |
| $ | 매치는 문자열의 끝 또는 줄(문자열) 끝에 있는 \n 바로 앞에서 발생해야 합니다. | -\d{4}$ | "8-12-2012"에서 "-2012" |
| \A | 매치는 반드시 문자열의 시작 위치에서 발생해야 합니다. | \A\w{3} | "Code-007-"에서 "Code" |
| \Z | 매치는 문자열의 끝 또는 문자열 끝의 \n 바로 앞에서 발생해야 합니다. | -\d{3}\Z | "Bond-901-007"에서 "-007" |
| \z | 매치는 반드시 문자열의 끝에서 발생해야 합니다. | -\d{3}\z | "-901-333"에서 "-333" |
| \G | 매치는 이전 매치가 끝난 지점에서 발생해야 합니다. | \G\(\d\) | "(1)(3)(5)[7](9)"에서 "(1)", "(3)", "(5)" |
| \b | 매치는 \w(영숫자) 문자와 \W(비영숫자) 문자 사이의 경계에서 발생해야 합니다. | \b\w+\b | "Room#1"에서 "Room", "1" |
| \B | 매치는 \b 경계가 아닌 위치에서 발생해야 합니다. | \Bend\w*\b | "end sends endure lender"에서 "ends", "ender" |
앵커 활용 예제
다음은 $ 앵커를 사용해 문자열 끝에 있는 연도를 추출하는 간단한 C# 코드입니다.
using System;
using System.Text.RegularExpressions;
class Program {
static void Main() {
string input = "8-12-2012";
Match m = Regex.Match(input, @"-\d{4}$");
Console.WriteLine(m.Value); // 출력: -2012
}
}
^와 \A, $와 \Z/\z의 차이점
^와 $는 RegexOptions.Multiline 옵션이 적용되면 각 줄의 시작과 끝을 의미하지만, \A, \Z, \z는 옵션과 무관하게 항상 전체 문자열의 시작과 끝만을 가리킵니다. 또한 \Z는 문자열 끝의 줄바꿈(\n) 직전까지 매치를 허용하는 반면, \z는 오직 문자열의 마지막 위치에서만 매치를 허용한다는 점이 서로 다릅니다.
마무리
앵커를 적절히 활용하면 불필요한 매칭 시도를 줄여 정규식 처리 성능을 높일 수 있고, 원하는 위치에서만 패턴이 일치하도록 만들어 검색의 정확성을 크게 향상시킬 수 있습니다. 입력값 검증, 로그 파싱, 데이터 추출 등 다양한 상황에서 앵커를 적극적으로 활용해 보시기 바랍니다.