본문 바로가기

Academy I/Tech Academy

Regular expression

정규표현식

 

기본 메타 문자

 .

 모든 문자 일치

 |

 OR 왼쪽 문자(혹은 패턴) 혹은 오른쪽 문자(혹은 패턴)과 일치

 []

 문자 집합 구성원 중 하나와 일치

 예) [abc] : a 혹은 b 혹은 c

 [^]

 문자 집합 구성원을 제외하고 일치, [^abc] : a,b,c 제외한 모든 문자

 -

 범위 정의 ([A-Z]와 같은 형태로 대문자 A에서 Z사이의 문자를 의미)

 \

 다음에 오는 문자를 이스케이프1

패턴설명
[abdef]

abdef 에 매칭.

[c-m]
cdefg...., m에 매칭.
[G-J]
GHIJ에 매칭.
[a-zA-Z]
모든 대소문자 알파벳에 매칭.
[5-8]
5678에 매칭.


패턴설명
[-az]
az-와 매칭.
 는 문자사이에 있으면 범위를 나타내는 메타캐릭터가 되지만, 캐릭터 클래스의 최초에 위치하면 이스케이프하지 않아도 문자그대로의 하이픈으로 인식한다)
[a\-z]
az-와 매칭.
(위와 달리  가 캐릭터 클래스의 중간에 위치했으므로 이스케이프 하지 않으면 범위를 나타내는 메타캐릭터로 인식해 버린다)
[^0-9]
숫자 이외의 모든 문자와 매칭


foob[aeiou]r
foobarfoober 등과 매칭하지만 foobbrfoobcr 등과는 매칭하지 않는다.
foob[^aeiou]r
foobbrfoobcr 등과 매칭하지만, foobarfoober등과는 매칭하지 않는다.

문자

집합 일치

[abcwxyz]

7개의 문자 중 하나와 일치

[a-cw-z]

위와 같음

[a-zA-Z]

52개의 대소문자 알파벳 문자 중 하나와 일치

[\000-\177]

모든 7비트 아스키 문자와 일치


패턴

일치하는 문자열

일치하지 않는 문자열

/bet.y/

betty betsy bet=y bet.y

bety betsey

/3\.14159/

3.14159

3014159

 



수량자

 *

 앞의 문자나 부분식2이 0개 이상 탐욕적으로 찾기

 *?

 탐욕적 수량자 *를 게으른(lazy) 수량자로 바꿔 찾기

 +

 앞의 문자나 부분식을 하나 이상 탐욕적으로 찾기

 +?

 탐욕적 수량자 +를 게으른(lazy) 수량자로 바꿔 찾기

 ?

 앞의 문자나 부분식을 0개나 1개 찾기

 {n}

 앞의 문자나 부분식이 정확히 n번 일치하는 경우 찾기

 {m,n}

 앞의 문자나 부분식이 m번에서 n번 일치하는 경우 찾기

 {n,}

 앞의 문자나 부분식이 n번 이상인 경우를 탐욕적으로 찾기

 {n,}?

 탐욕적 수량자 {n,}를 게으른(lazy) 수량자로 바꿔 찾기

패턴설명계열대체패턴
*
0번 이상 반복
탐욕파
{0,}과 동일
+
1번 이상 반복
탐욕파
{1,}과 동일
?
0번 또는 1번 반복-{0,1}과 동일
{n}
n번 반복
탐욕파

{n,}
최소한 n번 반복
탐욕파

{n,m}
n번 이상 m번 이하 반복
탐욕파

*?
0번 이상 반복
검소파
{0,}?과 동일
+?
1번 이상 반복
검소파
{1,}?과 동일
??
0번 또는 1번 반복
검소파
{0,1}?과 동일
{n}?
n번 반복
검소파

{n,}?
최소한 n번 반복
검소파

{n,m}?
n번 이상 m번 이하 반복
검소파

패턴설명
foob.*r
foobarfoobalkjdflkj9rfoobr등과 매칭
foob.+r
foobarfoobalkjdflkj9r 등과 매칭하지만 foobr과는 매칭안함
foob.?r
foobar, foobbrfoobr 등과 매칭하지만 foobalkj9r 와는 매칭안함
fooba{2}r
오직 foobaar 와만 매칭 (그러므로 사실 정규표현식을 사용하는 의미가 없음)
fooba{2,}r
foobaar, foobaaarfoobaaaar 등과 매칭하지만 foobar와는 매칭안함
fooba{2,3}r
foobaarfoobaaar두 경우와만 매칭하지만 기타foobaaaarfoobar등과는 매칭안함


패턴

일치하는 문자열

fred\t*barney/

fred\tbarney fred\t\tbarney

fred\t\t\tbarney fredbarney

/fred.*barney/

fred 나오고 뒤에 어디든 barney

나오는 모든 줄은 일치 (잡동사니 패턴)

/fred +barney/

fred barney fred barney

fredbarney 일치하지 않음

/bamm-?bamm/

bamm-bamm bammbamm


패턴

의미

/a{5,15}/ 

a 5번에서 15 반복한 문자열과 일치

/(fred){3,}/ 

또는 이상 fred 있으면 일치

/\w{8}/ 

정확히 단어로 있는 8개문자와 일치

/,{5}chamelon/ 

,,,,,chamelon 일치

/a{0,}/ 

/a*/ 같음

/a{1,}/ 

/a+/ 같음

/a{0,1}/ 

/a?/ 같음




위치 지정

 ^

 입력 문자열의 시작 부분에서 그 다음 나오는 문자나 부분식과 일치하는지 검사

 \A

 어떤 정규식에서는 ^의 역할을 함

 $

 문자열의 끝과 일치

 \Z

 어떤 정규식에서는 $의 역할을 함

 \b

 단어 경계(단어와 공백 사이의 위치)와 일치

 예) 'st\b'는 "test"의 st는 찾지만, "tester"의 st는 찾지 않음

 !주의! test test 에서 test 사이의 빈공간인 space와는 다른 의미

 \B

 \b와 반대(비단어 경계)로 일치. 즉 "\b"의 예제의 반대 결과가 나옴


문자 집합

일치

[^def]

d e, f 문자를 제외한 모든 단일 문자와 일치합니다.

[^n\-z]

n, 빼기 기호(-), z 제외한 모든 문자와 일치(빼기 기호 앞에 역슬래시를 붙인 것이 주의. 빼기 기호는 메타문자) 하지만 /HAL-[0-9]+/ 패턴의 빼기 기호는 역슬래시로 회피할 필요가 없음. 왜냐하면, 문자 집합 에서의 빼기 기호는 이상 메타 문자가 아님


패턴

의미

/^fred|barney$/ 

문자열 앞의 fred 문자열 끝의 barney 일치

/^(fred|barney)$/ 

전체가 fred 또는 barney로만 구성되어 있는 문자열과 일치

/(wilma|pebbles?)/ 

wilma

pebbles 또는 pebble 일치

/^(\w+)\s+(\w+)$/ 

'단어' 약간의 공백 문자 그리고 다른 '단어' 있는 문자열이 있는 줄과 일치 (fred flintstone)


패턴

일치하는 문자열

일치하지 않는 문자열

/^fred/

문자열의 부분에 fred 나올 때만 일치

manfred mann

/rock$/

문자열의 부분에 rock 나올 때만 일치

knute rockne

/^\s*$/

탭이나 스페이스를 포함한 줄을 일치시키는 패턴

 

 

 

특수한 문자

 [\b]

 역스페이스

 \cx

 x로 표시된 제어문자 찾기. x는 [A-Za-z] 이어야 함. 아니면 c는 리터럴 'c'로 간주

 예) \cM = Control-M 이나 캐리지 리턴 문자. 

 \d

 모든 숫자와 일치. [0-9]와 동일

 \D

 \d와 반대. [^0-9]와 동일

 \f

 용지 공급 문자 찾기. 페이지 넘기기(formfeed) = \x0a3, \cL

 \n

 줄 바꿈 문자 찾기. \x0a, \cJ

 \r

 캐리지 리턴. \x0d, \cM

 \s

 공백, 탭, 용지 공급 등과 같은 문자 찾기. [\f\n\r\t\v]

 \S

 \s와 반대로 일치. [^\f\n\r\t\v]

 \t

 탭 문자 찾기. \x09, \cI

 \v

 세로 탭 문자 찾기. \x0b, \cK

 \w

 영숫자 문자나 밑줄과 일치. [a-zA-Z0-9_]

 \W

 \w와 반대로 일치. [^a-zA-Z0-9_]

 \xn

 n으로 표시된 16진수 이스케이프 값과 일치. 16진수는 정확히 2자리여야 함

 \0n

 n으로 표시된 8진수 숫자와 일치. 가급적 사용하지 않는 것이 좋음



축약형

동일문자 집합

예시

\d

[0-9]

/HAL-[0-9]+/ /HAL-\d+/ 같음

\w

[A-za-z0-9]

/fred \w+ barney/

fred , '단어'가 나온 바로 다음에 칸과 barney 나오는 문자열과 일치할 것입니다. fredbarney 사이에 하나의 단어가 있되 단어 끝이 하나의 칸으로 구분된 문자열과 일치할 것입니다.

\s

[\f\t\n\r ]

공백문자를 일치시킬 사용하기 좋음


축약형

동일문자집합

축약형의 반대

동일문자집합

\d

[0-9]

[^\d], \D

[^0-9] 숫자가 아닌 문자

\w

[A-za-z0-9]

[^\w], \W

[^A-za-z0-9] 단어가 아닌 문자

\s

[\f\t\n\r ]

[^\s], \S

[^\f\t\n\r ] 공백 문자가 아닌 문자


 

역참조와 전후방탐색

(pattern)

 하위 표현식 정의. 패턴을 찾아 일치하는 항목을 캡처하는 부분식. 가로 자체 '('나 ')'를 찾고 싶으면 '\'를 붙여 이스케이프하면 된다. '\(', '\)'

\1

 첫 번째 일치한 하위 표현식, 두 번째 일치한 하위 표현식은 \2로 표기

 (?=pattern)

 전방탐색

 (?!pattern)

 부정형 전방탐색

 ?(BR4)true

 조건 지정

 ?(BR)true|false

 else 표현식 조건 지정

패턴설명
(fee)|(fie)|(foe)
단순히 fee|fie|foe라고 쓰는 것 보다 가독성이 좋아졌다
(foobar){2,3}

()로 감싸인 foobar전체 문자열이 2~3번 반복된 경우와 매칭하게 된다.

(foobarfoobar 또는 foobarfoobarfoobar 이상 두가지 경우와 매칭할 것이다)

foobar{2,3}
위의 예에서 ()를 뺀 경우이다. 앞의 문자열이 fooba든 아니든 마지막 문자r이 2~3번 반복된 문자열 즉, rrrrr, 이 포함된 문자열과만 매칭할 것이다.(괄호를 뺐으니 {}직전의 한 문자와만 매칭한다)
foob([0-9]|a+)rfoob0rfoob8rfoobarfoobaarfoobaaaar, 등과 매칭할 것이다.
패턴Replace설명
(.*) (.*)
$2, $1

두 단어의 순서를 바꾸고 그 사이에 컴머를 넣는 예. 

예: "John Smith"-> "Smith, John".




패턴

일치하는 문자열

/fred+/

freddddddddd

/(fred)+/

fredfredfred

/(fred)*/

hello, world

대상 문자열이 비어있는 경우를 포함해

문자열에 대해 일치


패턴

일치하는 문자열

/fred|barney|betty/

fred나 barney 아니면 betty를 언급한 모든 문자열과 일치합니다.

/fred( |\t)+barney/

더하기(+)는 한 번 또는 여러 번 반복. 반복 할 때마다 ( |\t)는 빈칸이나 탭 문자와 일치할 기회를 가짐. 두 이름 사이에 빈 칸이나 탭 문자 중 적어도 하나는 존재해야 함.

/fred( +|\t+)barney/

fred와 barney 사이의 문자가 모두 빈 칸이거나 모두 탭이어야 함.

/fred (and|or) barney/

fred and barney 혹은fred or barney




대소문자 변환

 \E

 \L 혹은 \U 변환을 끝냄

 \l

다음에 오는 글자를 소문자로 변환 

 \L

 \E를 만날 때까지 모든 문자를 소문자로 변환

 \u

 다음에 오는 글자를 대문자로 변환

 \U

 \E를 만날 때까지 모든 문자를 대문자로 변환

입력패턴Replace결과
test ExAmple(.+) (.+)$1 $2test ExAmple
test ExAmple(.+) (.+)\U$1 $2TEST ExAmple
test ExAmple(.+) (.+)$1 \L$2test example
test ExAmple(.+) (.+)\u$1 \L$2Test example

 



옵션

i

 ignore case, 대소문자를 무시하여 찾음. 굳이 [a-zA-Z]라고 할 필요가 없음

 g

 global, 찾는 패턴을 하나만 찾지 말고 계속 해서 찾음. 탐욕적 수량자처럼 일치하는 구간을 늘리는 것이 아니라 일치하는 패턴의 개수가 늘어남

 m

 multiline, 다중행 모드라고도 하며 라인 별로 처리하는 것이 아니라 입력 문자열에 줄바꿈이 있어도 이를 특수문자로 변환하여 하나로 봄. 가장 큰 차이를 경험할 수 있는 기능은 ^와 $임.

 



정규표현식 온라인 실습

다음은 정규표현식을 온라인에서 테스트 해볼 수 있는 사이트들이다. 공부하기도 좋고 코드에 적용하기 전에 확인하기도 좋다. 여러 사이트들이 있지만 아래 사이트들이 가장 마음에 들었다.

 

  • Regex Hero: .NET(C#) 안에서 정규식을 사용할 때 할 수 있는 모든 것을 할 수 있다. 특히, Regex 옵션이 다른 개발언어와 사용방법이 조금 다른데 이런 것들을 적용할 수 있어서 매우 유용하다.
  • RegExr: 일반적인 정규표현식을 테스트 해볼 수 있다. 다양한 예제와 사용법도 같이 제공하고 있다.
  • regex101: pcre (php), javascript, python의 정규식을 테스트해 볼 수 있다. 여기서 제공하는 기능 중 가장 마음에 드는 것은 MATCH INFORMATION를 제공한다는 것이다. 자신이 입력한 각 정규식 요소가 어떻게 일치하는지 설명해준다.


[출처] [개발자 강좌] 정규표현식 (정규식; Regex)|작성자 sensible

[출처] http://egloos.zum.com/dryang/v/4005256

[출처] Perl 7_정규표현식|작성자 bitnang



'Academy I > Tech Academy' 카테고리의 다른 글

gcc 컴파일 과정  (0) 2015.02.09
sed(stream editor)  (0) 2015.02.04
[REGEX]Regular expression  (0) 2015.02.02
Awk  (0) 2015.02.02
assert와 매크로 함수를 이용한 디버깅 정보 얻기  (0) 2015.01.22
Advanced Bash-Scripting - 문자열  (0) 2015.01.22
Advanced Bash-Scripting - 특수문자  (0) 2015.01.22
Advanced Bash-Scripting - 예제  (0) 2015.01.22