regex
TRANSCRIPT
![Page 1: Regex](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/1.jpg)
Preface
Regular Expression (정규표현식)의 약칭 REGEX
string pattern은 문자열의조합되는 규칙
meta charater는 다른 의미를 수식하는문자
grep은 정규식을 평가할수 있는 유틸리티입니다.
egrep, fgrep은 grep의특화된버전입니다.
sed는 스트림 에디터입니다.
awk는 패턴식을다룰수 있는언어툴입니다.
![Page 2: Regex](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/2.jpg)
what is String Pattern?
조합된 문자열의 규칙
e-mail 주소
중간에 @ 문자가등장
@ 문자의오른쪽은 dot 와 영문, 아스키코드로이루어짐
@ 문자의왼쪽은계정명
Web URL
http:// 으로시작
호스트이름뒤에는 URI 가붙고디렉토리구조로 명명
CGI 기법이사용될경우에 ? 이등장할수도 있음
![Page 3: Regex](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/3.jpg)
Regular Expression : Examples
a.cdef?
[a-zA-Z]+
.*boy
(caret|dalar)
\(.*/\)[^/]*
^Do.*\?$
http://\([a-zA-Z0-9.-]\)/.*
http://.*\?(.*)
REGEX를배운뒤에해석해봅시다!
![Page 4: Regex](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/4.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/5.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/6.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/7.jpg)
applying pattern (con't)
^, $ - position
^ftp : "ftp"로시작하는행
^$ : 비어있는행 (행의 시작과끝에아무런문자도없다)
<BR>$ : <BR>로끝나는경우
![Page 8: Regex](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/8.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/9.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/10.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/11.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/12.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/13.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/14.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/15.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/16.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/17.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/18.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022020123/559865de1a28abb92f8b4745/html5/thumbnails/19.jpg)
REGEX and PCRE
POSIX REGEX
간단한패턴매칭에사용된다.
패턴의복잡함이늘어나면성능저하가발생.
처음엔꼭 POSIX REGEX부터학습해야만한다.- Standard니까!
PCRE (Perl Compatible Regular Expr.)
perl에서파생된확장된정규표현식
매우빠른속도, 확장된표현식에...
C, C++, 기타대부분의언어가지원한다. (추가라이브러리로제공)
실무라면 PCRE를사용하는편이낫다.