본문 바로가기

C#/정규 표현식

C#에서 '역참조 구문'을 사용하여 그룹화된 문자열을 정규 표현식 안에서 참조하는 방법

역참조 구문을 사용하면 그룹화한 문자열을 정규 표현식 안에서 참조할 수 있다.

 

1. 동일한 문자 두 개가 나올 때를 검색하는 방법 (처음 나온 그룹을 참조하여 동일한 문자를 인식)

 

var text = “도로를 지나가는 차들이 뛰뛰하고 경적을 울리면 반대쪽 차들이 빵빵하고 울렸다.”;
var pattern = @”(\w)\1;        //\1이 역참조 구문이다.
var matches = Regex.Matches(text, pattern);
foreach (Match m in matches)
    Console.WriteLine(“‘{0}’”, m.Value);

 

결과

‘뛰뛰’
‘빵빵’

 

\n (n은 숫자)을 통해 그룹화한 문자열을 참조할 수 있다.

 

@”(\w)\1이라는 정규 표현식으로 처음에 나오는 (\w)에 의해 ‘뛰’라는 글자가 일치했다고 하면 \1은 이렇게 일치한 ‘뛰’를 나타낸다.

 

즉, 동일한 문자 두 개가 나올 때 @”(\w)\1”과 일치한다.

 

 

 

2. 단어가 공백으로 구분된 문자열에서 세 문자이면 앞뒤가 같은 문자로 구성된 문자열을 구하는 방법

 

역참조 구문을 사용해 ‘앞뒤가 같은 문자’를 표현

var text = “기러기 펠리컨 청둥오리 오리너구리 토마토 pop push pop”;
var pattern = @”\b(\w)\w\1\b”;
var matches = Regex.Matches(text, pattern);
foreach (Match m in matches)
    Console.WriteLine(“‘{0}’”, m.Value);

 

결과

'기러기’
‘토마토’
‘pop’

 

 

'동일한 문자 두 개 연속'을 검색할 때와 마찬가지로 (\w)와 \1을 사용하였다.

이 두 개의 문자 사이에 단어를 구성하는 문자가 한 개 있으면 문제에서 주어진 조건을 만족한다.

@”(\w)\w\1

이 정규 표현식은 길이가 3이고 앞뒤가 같은 문자인 단어를 나타낼 수 있다.

 

이 정규 표현식 앞뒤에 \b를 썼다.

\b는 \w와 \w와의 경계 위치와 일치하므로 “pops”와는 일치하지 않게된다.

 

\b 대신 \s를 사용한다면 행의 시작 지점과 행의 끝 지점에 있는 단어가 일치하지 않으므로 주의해야 한다.