Regex

19
Preface Regular Expression (정규표현식)의 약칭 REGEX string pattern은 문자열의 조합되는 규칙 meta charater는 다른 의미를 수식하는 문자 grep은 정규식을 평가할 수 있는 유틸리티입니다. egrep, fgrepgrep의 특화된 버전입니다. sed는 스트림 에디터입니다. awk는 패턴식을 다룰 수 있는 언어툴입니다.

Transcript of Regex

Page 1: Regex

Preface

Regular Expression (정규표현식)의 약칭 REGEX

string pattern은 문자열의조합되는 규칙

meta charater는 다른 의미를 수식하는문자

grep은 정규식을 평가할수 있는 유틸리티입니다.

egrep, fgrep은 grep의특화된버전입니다.

sed는 스트림 에디터입니다.

awk는 패턴식을다룰수 있는언어툴입니다.

Page 2: Regex

what is String Pattern?

조합된 문자열의 규칙

e-mail 주소

중간에 @ 문자가등장

@ 문자의오른쪽은 dot 와 영문, 아스키코드로이루어짐

@ 문자의왼쪽은계정명

Web URL

http:// 으로시작

호스트이름뒤에는 URI 가붙고디렉토리구조로 명명

CGI 기법이사용될경우에 ? 이등장할수도 있음

Page 3: Regex

Regular Expression : Examples

a.cdef?

[a-zA-Z]+

.*boy

(caret|dalar)

\(.*/\)[^/]*

^Do.*\?$

http://\([a-zA-Z0-9.-]\)/.*

http://.*\?(.*)

REGEX를배운뒤에해석해봅시다!

Page 4: Regex

POSIX regex: meta char.

문자 지정 . 임의의 문자 한 개를 의미합니다.

반복 지정

? 선행문자패턴이 0개 혹은 1개 나타납니다. - ERE

+ 선행문자패턴이 1개 이상 반복됩니다. - ERE

* 선행문자패턴이 0개 이상 반복됩니다.

{...}(interval) 반복수를 직접 지정할 수 있습니다. 예를 들어

{3} : 3번 반복 {,7} : 7번 이하 {2,5} : 2~5번 반복

위치지정^ 라인의 앞부분을 의미합니다.

$ 라인의 끝부분을 의미합니다.

그룹 지정[...] 안에 지정된 문자들 그룹 중에 한 문자를 지정합니다.

[^...] 안에 지정된 그룹의 문자를 제외한 나머지(여집합)를 지정합니다.

기타

\ (escape) 메타의 의미를 없애줍니다.

| (alternation) OR연산을 합니다. - ERE

( ) 괄호는 패턴을 그룹화 및 백레퍼런스의 작동을 합니다.

* ERE - Extended Regular Expression

* POSIX RE - IEEE std 1003.1 (International standard)

Page 5: Regex

applying pattern

dot/period : . - any single character

c.b : cab, cbb, ccb, cdb, c1b, c2b 등등

a..b : axyb, a12b, ax0b, a#-b 등등

a.........b : 이런방식으로는쓰지않는다.

Page 6: Regex

applying pattern (con't)

?, +, *, {m,n} - iteration, interval

X?ML : XML or ML

can+ : can, cann, cannn, cannnn, ...

can* : ca, can, cann, cannn, ...

http.* : http://, httpd, https, http1234

"http"뒤에 어떤문자도 붙을수있다

abc{2,5} : abcc, abccc, abcccc, abccccc

interval expression은몇몇유틸, RE matching engine에서는지원않는다.

Page 7: Regex

applying pattern (con't)

^, $ - position

^ftp : "ftp"로시작하는행

^$ : 비어있는행 (행의 시작과끝에아무런문자도없다)

<BR>$ : <BR>로끝나는경우

Page 8: Regex

applying pattern (con't)

[ ], [^ ] - character class

[abcd] : a, b, c, d

[0-9] : 0, 1, 2, ... , 9

[a-zA-Z0-9] : 알파벳과숫자

[^0-9] : [0-9]을제외한나머지

^자체를그룹화하려면?

^이 [ 바로뒤에만오지않으면된다.

혹은 escape 시키거나...

interval expression은몇몇툴은옵션을넣어야만지원한다.

e.g. awk

Page 9: Regex

greedy matching

greedy matching 이란?

pattern 은최대한많은수의매칭을하려고함

greedy matching후 result set의범위를줄여나가면서정확한표현식을완성하도록...

non-greedy matching 이란?

greedy matching 결과를최소매칭을위해수정한결과.

$ var2="It’s gonna be <b>real</b>It’s gonna <i>change everything

</i> I feel"

$ echo $var2 | egrep -o "<.+>"

<b>real</b>It's gonna <i>change everything</i>

Page 10: Regex

non-greedy matching (con't)

non-greedy matching을 위한 표현식의 수정

$ var2="It’s gonna be <b>real</b>It’s gonna <i>change everything

</i> I feel"

$ echo $var2 | egrep -o "<.+>"

<b>real</b>It's gonna <i>change everything</i>

$ echo $var2 | egrep -o "<[^<>]+>"

<b>

</b>

<i>

</i>

Page 11: Regex

back-reference

매칭된 결과를 다시사용하는 패턴 (백레퍼런스)

"( )"로 묶인패턴매칭부분을 "\#"의형태로재사용

(#는숫자가순서대로), 0번은전체매칭결과

-v : invert

--color : Surround the matched (non-empty) strings

$ egrep "^(.+):x:[0-9]+:[0-9]+:.*:/home/\1:" /etc/passwd

sunyzero:x:500:500:Steven Kim:/home/sunyzero:/bin/bash

linuxer:x:502:502::/home/linuxer:/bin/bash

$ egrep -v "^(.+):x:[0-9]+:[0-9]+:.*:/home/\1:" /etc/passwd

... (생략, 상상하시기 바랍니다) ...

Page 12: Regex

back-reference (con’t)

back-reference 응용 : tag로 감싸여진 부분 추출

$ var2="It’s gonna be <b>real</b>It’s gonna <i>change everything

</i> I feel"

$ echo $var2 | egrep -o "<([a-zA-Z0-9]+)>.*</\1>"

<b>real</b>

<i>change everything</i>

$ echo $var2 | egrep --color "<([a-zA-Z0-9]+)>.*</\1>"

... 생략 ...

Page 13: Regex

Tip! - sed (stream ed)

substitution (sed)

vim의 substitution command와같다

vim의 substitution command는 sed의기능이포함된것뿐이다!

= sed를알면 vim도 알고... UNIX는이렇게서로연관된기능들이많다.

$ var2="It’s gonna be <b>real</b>It’s gonna <i>change everything

</i> I feel"

$ echo $var2 | sed -e "s/<[^<>]\+>/ /g"

It's gonna be real It's gonna change everything I feel

$ echo $var2 | sed -e "s,<[^<>]\+>, ,g"

Page 14: Regex

Tip! - awk

awk에서도 위의모든 기능을 구현할 수 있다.

$ var2="It’s gonna be <b>real</b>It’s gonna <i>change everything

</i> I feel"

$ echo $var2 | awk '{ gsub(/[ ]*<[^<>]+>[ ]*/, " "); print }'

It’s gonna be real It’s gonna change everything I feel

Page 15: Regex

alternation

( )는 alternation 용도로도 사용됨

"( )" alternation 이나 pattern group을묶을때도사용된다.

$ echo "cat is not dog" | egrep -o "(cat|dog)"

cat

dog

$ echo "My Childhood~~~ bye bye" | egrep -o "(child|boy)?hood"

hood

Page 16: Regex

predefined character class

클래스 설 명

[[:alnum:]] 알파벳과 숫자들의 모음

[[:alpha:]] 알파벳들 (대소문자)

[[:blank:]] Tab(\t)을 의미

[[:cntrl:]] 제어문자들을 의미

[[:digit:]] 숫자들을 의미

[[:xdigit:]] 16진수(hex)형 숫자들을 의미, 즉 0-9a-fA-F 를 포함한다.

[[:upper:]] 알파벳 대문자

[[:lower:]] 알파벳 소문자

[[:space:]] tab(\t), CR(\r), New line(\n) 을 포함한다.

[[:print:]] 출력 가능한 문자들

[[:graph:]] 공백을 제외한 문자들

[[:punct:]] 출력 가능한 특수문자들

Page 17: Regex

predefined character class (con't)

[...]안에 조합가능

sunyzero@email까지만잘렸다. 모두 나오게하려면?

$ var5="[email protected]:010-8500-80**:Sun-young Kim:AB-0105R"

$ echo $var5 | egrep -o "^[[:alpha:]@]+"

sunyzero@email

$ echo $var5 | egrep -o "[[:upper:][:digit:]-]{8}"

010-8500

AB-0105R

Page 18: Regex

boundary - ERE

word 경계 검색에 사용

\b boundary가 맞는 표현식만 찾습니다. (단어 경계면 검색)

\B boundary에 맞지 않는 표현식만 찾습니다. (단어 경계면이 아닌 경우만 검색)

$ echo $var3 | egrep --color "\B[a-j]+\B"

abc? <def> 123hijklm

$ var3="abc? <def> 123hijklm"

$ echo $var3 | egrep -o "[a-j]+"

abc

def

hij

$ echo $var3 | egrep --color "\b[a-j]+\b"

abc? <def> 123hijklm

Page 19: Regex

REGEX and PCRE

POSIX REGEX

간단한패턴매칭에사용된다.

패턴의복잡함이늘어나면성능저하가발생.

처음엔꼭 POSIX REGEX부터학습해야만한다.- Standard니까!

PCRE (Perl Compatible Regular Expr.)

perl에서파생된확장된정규표현식

매우빠른속도, 확장된표현식에...

C, C++, 기타대부분의언어가지원한다. (추가라이브러리로제공)

실무라면 PCRE를사용하는편이낫다.