Preface 
 Regular Expression (정규표현식)의 약칭 REGEX 
 string pattern은 문자열의 조합되는 규칙 
 meta charater는 다른 의미를 수식하는 문자 
 grep은 정규식을 평가할 수 있는 유틸리티입니다. 
 egrep, fgrep은 grep의 특화된 버전입니다. 
 sed는 스트림 에디터입니다. 
 awk는 패턴식을 다룰 수 있는 언어툴입니다.
what is String Pattern? 
 조합된 문자열의 규칙 
 e-mail 주소 
 중간에 @ 문자가 등장 
 @ 문자의 오른쪽은 dot 와 영문, 아스키코드로 이루어짐 
 @ 문자의 왼쪽은 계정명 
 Web URL 
 http:// 으로 시작 
 호스트이름뒤에는 URI 가 붙고 디렉토리구조로 명명 
 CGI 기법이 사용될 경우에 ? 이 등장할수도 있음
Regular Expression : Examples 
a.cdef? 
[a-zA-Z]+ 
.*boy 
(caret|dalar) 
(.*/)[^/]* 
^Do.*?$ 
http://([a-zA-Z0-9.-])/.* 
http://.*?(.*) 
REGEX를 배운 뒤에 해석해봅시다!
POSIX regex: meta char. 
문자 지정 . 임의의 문자 한 개를 의미합니다. 
반복 지정 
? 선행문자패턴이 0개 혹은 1개 나타납니다. - ERE 
+ 선행문자패턴이 1개 이상 반복됩니다. - ERE 
* 선행문자패턴이 0개 이상 반복됩니다. 
{...} 
(interval) 반복수를 직접 지정할 수 있습니다. 예를 들어 
{3} : 3번 반복 {,7} : 7번 이하 {2,5} : 2~5번 반복 
위치지정 
^ 라인의 앞부분을 의미합니다. 
$ 라인의 끝부분을 의미합니다. 
그룹 지정 
[...] 안에 지정된 문자들 그룹 중에 한 문자를 지정합니다. 
[^...] 안에 지정된 그룹의 문자를 제외한 나머지(여집합)를 지정합니다. 
기타 
 (escape) 메타의 의미를 없애줍니다. 
| (alternation) OR연산을 합니다. - ERE 
( ) 괄호는 패턴을 그룹화 및 백레퍼런스의 작동을 합니다. 
* POSIX RE - IEEE std 1003.1 (International standard) 
* ERE - Extended Regular Expression
applying pattern 
 dot/period : . - any single character 
 c.b : cab, cbb, ccb, cdb, c1b, c2b 등등 
 a..b : axyb, a12b, ax0b, a#-b 등등 
 a.........b : 이런 방식으로는 쓰지 않는다.
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에서는 지원 않는다.
applying pattern (con't) 
 ^, $ - position 
 ^ftp : "ftp"로 시작하는 행 
 ^$ : 비어있는 행 (행의 시작과 끝에 아무런 문자도 없다) 
 <BR>$ : <BR>로 끝나는 경우
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
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> 
 pattern 은 최대한 많은 수의 매칭을 하려고 함 
 greedy matching후 result set의 범위를 줄여나가면서 정확한 표현식 
을 완성하도록... 
 non-greedy matching 이란? 
 greedy matching 결과를 최소 매칭을 위해 수정한 결과.
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>
back-reference 
 매칭된 결과를 다시 사용하는 패턴 (백레퍼런스) 
 "( )"로 묶인 패턴 매칭 부분을 "#"의 형태로 재사용 
(#는 숫자가 순서대로), 0번은 전체 매칭 결과 
$ 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 
... (생략, 상상하시기 바랍니다) ... 
 -v : invert 
 --color : Surround the matched (non-empty) strings
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>" 
... 생략 ...
Tip! - sed (stream ed) 
 substitution (sed) 
 vim의 substitution command와 같다 
$ 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" 
 vim의 substitution command는 sed의 기능이 포함된 것뿐이다! 
= sed를 알면 vim도 알고... UNIX는 이렇게 서로 연관된 기능들이 많다.
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
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
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:]] 출력 가능한 특수문자들
predefined character class (con't) 
 [...]안에 조합가능 
$ var5="sunyzero@email.com: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 
 sunyzero@email까지만 잘렸다. 모두 나오게 하려면?
boundary - ERE 
 word 경계 검색에 사용 
b boundary가 맞는 표현식만 찾습니다. (단어 경계면 검색) 
B boundary에 맞지 않는 표현식만 찾습니다. (단어 경계면이 아닌 경우만 검색) 
$ var3="abc? <def> 123hijklm" 
$ echo $var3 | egrep -o "[a-j]+" 
$ echo $var3 | egrep --color "B[a-j]+B" 
abc? <def> 123hijklm 
abc 
def 
hij 
$ echo $var3 | egrep --color "b[a-j]+b" 
abc? <def> 123hijklm
REGEX and PCRE 
 POSIX REGEX 
 간단한 패턴 매칭에 사용된다. 
 패턴의 복잡함이 늘어나면 성능저하가 발생. 
 처음엔 꼭 POSIX REGEX부터 학습해야만 한다.- Standard니까! 
 PCRE (Perl Compatible Regular Expr.) 
 perl에서 파생된 확장된 정규표현식 
 매우 빠른 속도, 확장된 표현식에... 
 C, C++, 기타 대부분의 언어가 지원한다. (추가 라이브러리로 제공) 
 실무라면 PCRE를 사용하는 편이 낫다.

Regex

  • 1.
    Preface  RegularExpression (정규표현식)의 약칭 REGEX  string pattern은 문자열의 조합되는 규칙  meta charater는 다른 의미를 수식하는 문자  grep은 정규식을 평가할 수 있는 유틸리티입니다.  egrep, fgrep은 grep의 특화된 버전입니다.  sed는 스트림 에디터입니다.  awk는 패턴식을 다룰 수 있는 언어툴입니다.
  • 2.
    what is StringPattern?  조합된 문자열의 규칙  e-mail 주소  중간에 @ 문자가 등장  @ 문자의 오른쪽은 dot 와 영문, 아스키코드로 이루어짐  @ 문자의 왼쪽은 계정명  Web URL  http:// 으로 시작  호스트이름뒤에는 URI 가 붙고 디렉토리구조로 명명  CGI 기법이 사용될 경우에 ? 이 등장할수도 있음
  • 3.
    Regular Expression :Examples a.cdef? [a-zA-Z]+ .*boy (caret|dalar) (.*/)[^/]* ^Do.*?$ http://([a-zA-Z0-9.-])/.* http://.*?(.*) REGEX를 배운 뒤에 해석해봅시다!
  • 4.
    POSIX regex: metachar. 문자 지정 . 임의의 문자 한 개를 의미합니다. 반복 지정 ? 선행문자패턴이 0개 혹은 1개 나타납니다. - ERE + 선행문자패턴이 1개 이상 반복됩니다. - ERE * 선행문자패턴이 0개 이상 반복됩니다. {...} (interval) 반복수를 직접 지정할 수 있습니다. 예를 들어 {3} : 3번 반복 {,7} : 7번 이하 {2,5} : 2~5번 반복 위치지정 ^ 라인의 앞부분을 의미합니다. $ 라인의 끝부분을 의미합니다. 그룹 지정 [...] 안에 지정된 문자들 그룹 중에 한 문자를 지정합니다. [^...] 안에 지정된 그룹의 문자를 제외한 나머지(여집합)를 지정합니다. 기타 (escape) 메타의 의미를 없애줍니다. | (alternation) OR연산을 합니다. - ERE ( ) 괄호는 패턴을 그룹화 및 백레퍼런스의 작동을 합니다. * POSIX RE - IEEE std 1003.1 (International standard) * ERE - Extended Regular Expression
  • 5.
    applying pattern dot/period : . - any single character  c.b : cab, cbb, ccb, cdb, c1b, c2b 등등  a..b : axyb, a12b, ax0b, a#-b 등등  a.........b : 이런 방식으로는 쓰지 않는다.
  • 6.
    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에서는 지원 않는다.
  • 7.
    applying pattern (con't)  ^, $ - position  ^ftp : "ftp"로 시작하는 행  ^$ : 비어있는 행 (행의 시작과 끝에 아무런 문자도 없다)  <BR>$ : <BR>로 끝나는 경우
  • 8.
    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
  • 9.
    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>  pattern 은 최대한 많은 수의 매칭을 하려고 함  greedy matching후 result set의 범위를 줄여나가면서 정확한 표현식 을 완성하도록...  non-greedy matching 이란?  greedy matching 결과를 최소 매칭을 위해 수정한 결과.
  • 10.
    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>
  • 11.
    back-reference  매칭된결과를 다시 사용하는 패턴 (백레퍼런스)  "( )"로 묶인 패턴 매칭 부분을 "#"의 형태로 재사용 (#는 숫자가 순서대로), 0번은 전체 매칭 결과 $ 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 ... (생략, 상상하시기 바랍니다) ...  -v : invert  --color : Surround the matched (non-empty) strings
  • 12.
    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>" ... 생략 ...
  • 13.
    Tip! - sed(stream ed)  substitution (sed)  vim의 substitution command와 같다 $ 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"  vim의 substitution command는 sed의 기능이 포함된 것뿐이다! = sed를 알면 vim도 알고... UNIX는 이렇게 서로 연관된 기능들이 많다.
  • 14.
    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
  • 15.
    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
  • 16.
    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:]] 출력 가능한 특수문자들
  • 17.
    predefined character class(con't)  [...]안에 조합가능 $ var5="sunyzero@email.com: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  sunyzero@email까지만 잘렸다. 모두 나오게 하려면?
  • 18.
    boundary - ERE  word 경계 검색에 사용 b boundary가 맞는 표현식만 찾습니다. (단어 경계면 검색) B boundary에 맞지 않는 표현식만 찾습니다. (단어 경계면이 아닌 경우만 검색) $ var3="abc? <def> 123hijklm" $ echo $var3 | egrep -o "[a-j]+" $ echo $var3 | egrep --color "B[a-j]+B" abc? <def> 123hijklm abc def hij $ echo $var3 | egrep --color "b[a-j]+b" abc? <def> 123hijklm
  • 19.
    REGEX and PCRE  POSIX REGEX  간단한 패턴 매칭에 사용된다.  패턴의 복잡함이 늘어나면 성능저하가 발생.  처음엔 꼭 POSIX REGEX부터 학습해야만 한다.- Standard니까!  PCRE (Perl Compatible Regular Expr.)  perl에서 파생된 확장된 정규표현식  매우 빠른 속도, 확장된 표현식에...  C, C++, 기타 대부분의 언어가 지원한다. (추가 라이브러리로 제공)  실무라면 PCRE를 사용하는 편이 낫다.