1. Preface
Regular Expression (정규표현식)의 약칭 REGEX
string pattern은 문자열의 조합되는 규칙
meta charater는 다른 의미를 수식하는 문자
grep은 정규식을 평가할 수 있는 유틸리티입니다.
egrep, fgrep은 grep의 특화된 버전입니다.
sed는 스트림 에디터입니다.
awk는 패턴식을 다룰 수 있는 언어툴입니다.
2. what is String Pattern?
조합된 문자열의 규칙
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: 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
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 결과를 최소 매칭을 위해 수정한 결과.
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를 사용하는 편이 낫다.