본문 바로가기

C#/정규 표현식

정규 표현식 : 쉽게 검색처리를 작성할 수 있다.

"서기 XXXX년"이란 문자열을 검색하려면 어떻게 해야 할까?

 

String 클래스에 있는 FindIndex 메서드로 "서기"를 찾고 그 뒤에 숫자가 나오는지를 조사하고 그 다음에 "년"이 나오는지 조사하는 코드를 작성하면 구할 수 있을 것이다.

 

하지만 조건을 하나하나 코드로 작성해야하는 위 방법은 매우 귀찮다.

 

이러한 처리를 수행할 때 정규 표현식을 사용하면 매우 쉽게 검색 처리를 작성할 수 있다.

 

 

정규 표현식의 예시

[Ss]ource

"Source" 또는 "source"을 나타내는 정규 표현식
[]는 문자 그룹을 나타낸다.
[] 안에 여러 개의 문자를 지정할 수 있다.
위 표현에서는 'S'와 's'중 하나와 일치하는 것을 검색하게 된다.

 

Source|원천

"Source"또는 "원천"을 나타내는 정규 표현식
파이프 기호(|)는 ‘OR’를 의미한다. “Source”이나 “원천” 중 하나와 일치한다.
첫 번째 예시를 이 방법으로 표현하면 Source|source이 된다.

 

back.+

“back” 뒤에 임의의 문자가 한 문자 이상 나오는 것을 나타내는 정규 표현식
마침표 ‘.’는 줄바꿈 문자를 제외한 임의의 한 문자와 일치한다.
‘+’는 직전의 문자를 한 번 이상 반복하는 것과 일치한다.
다시 말해 “.+”라고 쓰면 임의의 문자가 한 문자 이상 연속해서 나온다는 것을 나타내므로 “backslash”나 “backup”이나 “back door”등과 일치한다.
‘+’ 대신 ‘*’을 사용 (back.*)하면 ‘직전 문자를 0번 이상 반복한다’라는 의미가 되어 “back” 자체와도 일치하게 된다.

 

[0-9]+초

“8초”, “24초”같은 초를 나타내는 정규 표현식
[] 안에 있는 ‘-’는 문자 범위를 나타낸다.
[0-9]는 [0123456789]와 같은 의미
그 뒤에 ‘+’가 있으므로 숫자가 한 글자 이상 연속하고 그 뒤에 ‘초’가 나오는 문자열과 일치한다.
영문과 숫자를 나타내려면 [0-9a-zA-z]라고 쓴다.

 

서기\d+년

“서기2021년”과 같이 연도를 나타내는 정규 표현식
‘\d’는 숫자 한 문자를 나타낸다.
‘+’는 한 번 이상 반복되는 것을 나타내므로 "서기11년", "서기12000년'과 같은 문자열과 일치한다.

 

주의할 점은 정규 표현식을 잘못 쓰면 의도한 부분 문자열과 다른 부분 문자열에 일치하게 된다.

 

[Tt]ime이라는 정규 표현식을 사용해서 검색하면 “Timer”나 “timetable”과 같은 문자열과도 일치한다.

 

그래서 문장 안에 time단독으로 단어가 있는지 여부를 조사하려면 [Tt]ime이라는 정규 표현식은 적절치 않다.

 

 

 

정규 표현식의 특수기호 목록

 

^ : 행의 시작 지점을 나타낸다.

$ : 행의 끝 지점을 나타낸다.

\b : 영문, 숫자와 그 밖의 문자와의 경계를 나타낸다.

. : 임의의 한 문자를 나타낸다.

\d : 0에서 9까지의 숫자 한 문자와 일치한다

\s : 공백, 탭, 줄바꿈 코드의 한 문자와 일치한다.

\S: 공백 외의 문자 하나와 일치한다

\w : 단어에 사용된 임의의 문자 하나와 일치한다.

| : 파이프기호로 구분된 요소중 하나와 일치한다.

[] : [] 안에 있는 임의의 한 문자와 일치한다. 하이픈(-)은 범위를 나타낸다.

[^] : 지정한 문자 외의 문자가 [] 안에서 일치한다.

* : 직전의 요소가 0번 이상 반복되는 것과 일치한다.

+ : 직전의 요소가 1번 이상 반복되는 것과 일치한다.

? : 직전의 요소가 1개 또는 0개 있는 것과 일치한다.

{n} : 직전의 요소가 n번 반복되는 것과 일치한다.

{n, } : 직전의 요소가 n번 이상 반복되는 것과 일치한다.

{n, m} : 직전의 요소가 n번 이상 m번 이하로 반복되는 것과 일치한다.

\p{IsHangulJamo} : 한글을 나타낸다.

\p{IsHangulCompatibilityJamo} : 한글을 나타낸다.

\p{IsHangulSyllables} : 한글을 나타낸다.

() : () 안에 있는 것을 그룹화한다. 1부터 순서대로 번호를 매긴다. Groups 속성을 통해 참조할 수 있다.

\n : 역참조 구문이다. n은 숫자다. 앞쪽에 있는 캡처링 그룹 내용과 일치하다.

*? : 최소한의 횟수로 반복되는 것에서 처음 일치하는 것을 나타낸다.

+? : 한 번 이상 그리고 최소한의 횟수로 반복되는 것을 나타낸다.