본문 바로가기
정리/정규표현식

정규표현식 기초

by 2744m 2018. 10. 10.

정규식 기본 문법

정규식 기분 문법은 크게 세 가지 정도로 나눌 수 있다.

  1. 패턴 그대로를 매칭하는 경우 : 편집기에서 “찾기” 기능을 통해서 특정 단어를 찾는 것 처럼, 단어 그대로를 패턴으로 사용하여 매치되는 영역을 찾는다.
  2. 메타문자 및 수량 한정자를 적용하는 경우 : 정규식 패턴에 쓰이는 문자중에는 특별한 의미를 가지는 메타 문자들이 있는데, 이들을 사용하여 보다 폭넓은 패턴에 매치할 수 있다.
  3. 그룹 및 look around 기능을 사용하는 경우 : 제법 고급 정규식이라 할 수 있는 부분으로, 패턴의 일부를 그룹으로 묶거나, 특정 패턴의 앞 뒤로 다른 패턴이 오는 조건을 더하는 경우이다.

정규식 메타 문자

메타 문자는 특정한 문자 혹은 문자 계열을 대신하여 표시하는 문자이다. 메타문자를 이용하면 특정한 규칙을 가진 여러 단어를 하나의 패턴으로 함축할 수 있다.

메타 문자의미
^
문자열의 시작. [...] 내에서 쓰이면 “일치하지 않는“의 의미가 된다.

^http는 문자열의 맨 처음에 http가 온 경우에 매치한다. (중간에 http가 나타난 경우는 매치하지 않음)
$문자열의 끝them$은 문자열이 them으로 끝난 경우에 them에 매치한다. 
\b단어의 경계. 공백, 탭, 컴마, 대시 등이 올 수 있다.
\bplay\b는 play 의 양 끝에 단어 경계가 오는 경우에만 play에 매치한다. 따라서 “playground”의 play에는 매치하지 않는다.
\B
\b가 아닌 것. 정규식 메타문자에서는 대소문자가 바뀌면 반대의 의미를 지니는 것들이 있다.

\bplay\B는 play뒤에 단어 경계가 아닌 것이 왔을 때 play에 매치한다. 따라서 play에는 매치하지 않지만 playground, playball의 play에는 매치한다.
\s공백문자공백, 탭에 매치한다.
\S공백문자가 아닌것
\d숫자. [0-9]와 같다.
\D숫자가 아닌 것. [^0-9]와 같다.
\w단어를 만들 수 있는 글자. 알파벳 대소문자, 숫자, 언더스코어가 포함된다.
\Wnot \w . 위의 것이 아닌 글자들이 해당된다.
\n개행문자. 캐리지리턴은 \r에 매치한다.그외에 탭 문자는 \t 에 매치
\이스케이프용 문자. 정규식 상의 특별한 의미가 있는 기호들을 문자 그대로 사용할 때 쓴다.\., \*, \$, \( 등과 같이 메타 문자를 리터럴하게 매치할 때 사용.
.임의의 문자 1개에 대응한다.

선택 패턴

| 문자를 이용하면 A | B 의 패턴으로 A 혹은 B에 매칭할 수 있다. 예를 들어 tomato와 potato에 모두 매칭하고 싶다면 tomato|potato 라고 쓸 수 있다.  선택 패턴은 이후에 등장하는 그룹 패턴과 관련하여 보다 강력하게 쓰일 수 있다.

그외의 선택패턴으로는 [ ... ] 있다. 대괄호속에 넣은 문자 중에서 하나에 매칭하는 것이다. [cfh]all 이라는 패턴은 call, fall, hall에 모두 매치될 수 있다. 특히 선택 패턴은 A-B를 통해서 특정 범위를 표현할 수도 있는데, 숫자의 경우 [0-9],  알파벳 소문자의 경우 [a-z], 알파벳대문자의 경우 [A-Z] 와 같은 식으로 한 글자에 매칭하는 것이 가능하다. 유니코드를 지원하는 정규식에서는 [ㄱ-힣]을 이용해서 한글 한 글자에 매칭하는 것도 가능하다.

또한 선택 패턴 내에서 ^ 이 쓰이면 not 의 의미가 되며, 이 문자 뒤에 오는 문자들은 제외하게 된다.

그룹

괄호는 그룹을 나타낸다. 그룹은 전체 패턴 내에서 다시 하나로 묶여지는 패턴 조각을 나타낸다. 특히 | 나 뒤에 나오는 수량 한정자를 그룹에 붙이는 형태로 많이 사용되며, 한 번 매치한 그룹이 다시 반복되어 나타나는 경우에도 사용할 수 있다.

  • (tom|pot)ato : tomato, potato에 모두 매치되는 패턴을 그룹을 써서 좀 더 줄였다.
  • (a|i){3}bc : a 혹은 i가 3개 온 후에 bc가 오는 패턴. aaabc, iiibc, aiabc, aaibc, iiabc 등에 매치된다.

괄호를 써서 묶은 부분은 1번부터 시작하는 그룹으로 참조할 수 있다. 앞서 매치한 그룹을 패턴 내에서 재사용하려면 \1과 같이 그룹번호를 역슬래시로 이스케이프하여 표현한다. tomato에서 to가 두 번 반복되는데 이는 다음과 같이 표현할 수 있다.

(to)ma\1
----
(to)       # to 에 매치하는 첫번째 그룹을 캡쳐한다.
    ma     # ma에 매치
      \1   # 1번 그룹인 to가 다시 나온다.

이를 좀 더 응용하면 아래와 같은 패턴도 만들 수 있다.

(a|b|c){2}ma\1

이 패턴은 a 혹은 b 혹은 c 중에서 매치되는 두 글자를 그룹으로 캡쳐하고 ma  뒤에 동일한 글자가 반복되는 패턴이다. 따라서 aamaaa, bcmabc, abmaab 등에 매치된다. 캡쳐된 그룹을 재사용하는 패턴은 그룹의 패턴이 아닌 캡쳐된 내용에 매치하므로 aamabb에는 매치되지 않는다.

비캡쳐링 그룹

(?: ) 을 사용하면 그룹으로 묶어는 주지만 캡쳐는 하지 않는 비 캡쳐링 그룹이 된다. 이는 특정한 수량 한정자등을 적용은 하려 하지만 최종 결과에서 따로 구분하여 사용할 필요가 없는 경우에 적용한다. (사실 캡쳐만 해놓고 사용하지 않아도 무방하다.)

수량 한정자

동일한 글자 혹은 동일한 족(family)이 n 개 만큼 나오는 경우에 수량한정자를 뒤에 붙일 수 있다.

표현의미
?앞의 표현식이 없을 수 있다.apples? 에서 s? 는 있을 수도 없을 수도 있다는 의미이며, 이 패턴은 apple, apples 모두에 매치될 수 있다.
*0개 이상이다.n\d* 는 n 뒤에 숫자가 0개 이상이라는 의미로, n, n1, n12 등이 모두 매치될 수 있다.
+1개 이상이다.*와 달리 적어도 1개는 있어야 매치된다.
{n}n 개 있다.n\d{3} 은 n 뒤에 숫자가 3개 온다는 의미이며, n1, n23, n3464 등은 매치되지 않는다.
{n, m}n개 이상, m 개 이하의 범위숫자 두 개를 사용해서 범위를 지정할 수 있다.
{n,}n개 이상우측 경계가 없는 범위로, 최소값 이상을 의미한다.

수량 한정자와 관련하여 *, + 는 기본적으로 greedy 하게 동작한다. 즉 가능한한 많은 글자를 먹고 다음 패턴을 찾는다는 것이다. 예를 들어

i like apples and bananas

라는 문장에 대해서 ^.*s를 매치하면 . 문자(아무 글자)는 욕심을 부려서 다 먹어치우기 때문에 bananas의 s까지, 전체 문장이 다 매치된다.

이 때, *  ? 를 조합하는 경우에는 반대로 동작한다. 즉 ^.*?s로 패턴을 주면 i like apples 까지만 매치한다.



[자주 쓰이는 패턴]


1) 숫자만 : ^[0-9]*$

2) 영문자만 : ^[a-zA-Z]*$

3) 한글만 : ^[가-힣]*$

4) 영어 & 숫자만 : ^[a-zA-Z0-9]*$

5) E-Mail : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$

6) 휴대폰 : ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$

7) 일반전화 : ^\d{2,3} - \d{3,4} - \d{4}$

8) 주민등록번호 : \d{6} \- [1-4]\d{6}

9) IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})



'정리 > 정규표현식' 카테고리의 다른 글

[C/C++] 정규표현식 사용방법 연습  (0) 2018.10.10

댓글