SlideShare a Scribd company logo
1 of 40
정규 표현식의 이해와 활용
한오석 , 커뮤니티 SU, 커뮤니티개발 1 팀 2008-08-28
2
목표
정규표현식을 쉽게 읽고 쓸 수 있으며 , 업무에 있어서 친숙하게 사용할 수 있는 계기를 마련한
다 .
정규표현식의 간단한 사용법을 통해 정규표현식을 사용해야 하는 이유를 전한다 .
정규표현식의 역사와 엔진 종류 및 매치 방식을 통해 정규표현식의 이해도를 높인다 .
기분문법과 언어별 차이를 중심으로 기본지식을 다진다 .
효율적인 정규표현식의 활용법을 설명함으로써 업무에 활용할 수 있는 다양한 방법을 제시한
다 .
실습을 통해 정규표현식이 더욱 친숙해 질 수 있는 계기를 마련한다 .
3
목차
정규 표현식의 이해
정규표현식의 소개 ( 정규표현식의 정의와 정규표현식을 사용하는 이유 )
정규표현식의 역사 ( 정규표현식의 역사를 통한 발전과정 및 종류의 이
해 )
정규표현식 엔진 및 매치 ( 정규표현식 엔진 소개와 매치방식 이해 )
정규표현식 기본문법 ( 기본문법과 언어별 차이의 이해 )
정규 표현식의 활용
정규표현식의 활용 ( 스크립트 언어 , java, 개발툴에서의 활용 )
효율적인 정규표현식의 사용 ( 최적화 매치 방식 , 벤치마킹 )
실습
4
정규표현식의 소개
정규 표현식 (Regular Expreesion) – 메타문자 (metacharacters) 의 문자
집합
5
정규표현식의 소개
왜 정규 표현식과 친해져야 하는가 ?
6
정규표현식의 역사
유래 – 오토마타 이론 (automata theory) 과 형식언어 이론 (formal
language theory)
1950s – 수학자 Stephen Cole Kleene 이 그의 수학적 모델이름을
Regular sets 라 명명
1968 – Ken Thompson “ 정규 표현식 검색 알고리즘” 논문 발표 , UNIX qed
에디터 (ed 에디터의 전신 ) 에 적용시키며 전산분야에 응용되기 시작
1970s – ed 에디터의 g/regex/p( 정규식에 매치되는 행을 출력하는 명령
어 ) 기능을 이용하여 grep (Global Regular Expression Print) 유틸리
티 개발
이후 egrep, awk, sed 등을 통해 발전
1986 – POSIX (Portable Operating System Interface) 발표
1987 – Larry Wall 이 sed 와 awk 의 정규 표현식용 프로그램의 전통을
계승한 perl 발표
2002 – java 1.4 버전 java.util.regex 제공
7
정규표현식의 역사
POSIX (Portable Operating System Interface)
- 운영 체제 사이의 이식성을 위해 발효된 광범위한 표준
- 정규 표현식의 혼란스러운 상황을 추스리기 위해 정규 표현식을 두 가지
유형 (BRE, ERE) 으로 분류
- Locale 개념의 지원
날짜 , 시각 , 화펴등 문자 해석은 같으나 문화적 관습에 따라 달라지는
것들을 모아 놓음
ex)
8
정규표현식 엔진 및 매치
정규표현식 엔진
1.DFA (Deterministic Finite Automata, 결정적 유한 오토마타 )
2.NFA (Nondeterministic Finite Automata, 비결정적 유한 오토마타 )
3.POSIX NFA(POSIX 표준 NFA)
4.NFA/DFA 혼합형
9
정규표현식 엔진 및 매치
정규표현식 매치
1.가장 먼저 시작하는 ( 가장 왼쪽에 있는 ) 매치가 더 우선시 된다 .
ex) The dragging belly indicates your cat is too fat
(fat|cat|belly)
2. 표준수량자는 greedy quantifier 이다 .
10
정규표현식 엔진 및 매치 – DFA (Deterministic Finite Automata)
DFA (Deterministic Finite Automata, 결정적 유한 오토마타 )
사용되는 프로그램 : awk, egrep, flex, lex, MySQL, Procmail
특징 : 텍스트 중심 엔진
매치 방법이 매우 빠름
매치 방법이 일관적임
| - 최대길이에 매치됨
11
정규표현식 엔진 및 매치 – DFA (Deterministic Finite Automata)
Text : Come back tonight at 9 o’clock
Regex : to(nig|knight|night)
C b a c k t o n i g h t a t 9 o’clock
t o ( n n i g h ti n i g h tk| | )
o m e o m et
g
12
정규표현식 엔진 및 매치 – NFA (Nondeterministic Finite Automata)
NFA (Nondeterministic Finite Automata, 비결정적 유한 오토마타 )
사용되는 프로그램 : Java, Perl, sed, vi, grep, less, more, PHP,
Python, Ruby, GNU Emacs, CRE 라이브러리 , .net
특징 : 정규 표현식 중심 엔진
백트래킹 (Backtracking) 을 사용하여 매치
| - 최소길이에 매치됨
13
정규표현식 엔진 및 매치 – NFA (Nondeterministic Finite Automata)
Text : Come back tonight at 9 o’clock
Regex : to(nig|knight|night)
C b a c k t o n i g h t a t 9 o’clock
t o ( n n i g h ti n i g h tk| | )
o m e o m et
g
14
정규표현식 엔진 및 매치 – NFA (Nondeterministic Finite Automata)
Text : Come back tonight at 9 o’clock
Regex : to(night|knight|nig)
C b a c k t o n i g h t a t 9 o’clock
t o ( n n i g h ti n i gh t k| | )
o m e o m et
g
15
정규표현식 엔진 및 매치 – NFA (Nondeterministic Finite Automata)
16
정규표현식 엔진 및 매치 – POSIX NFA(POSIX 표준 NFA)
POSIX NFA(POSIX 표준 NFA)
사용되는 프로그램 : mawk, GNU Emacs
17
정규표현식 엔진 및 매치 – NFA/DFA 혼합형
NFA/DFA 혼합형
사용되는 프로그램 : GUN awk, GNU grep/egrep, Tcl
18
정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 )
일반 클래스
메타문자 이 름 설 명 예시
[…] 문자 클래스 클래스 내 열거된 문자 중 한 개와 매
치
[ABC123]
[^…] 부정형 문자 클래스 클래스 내 열거되지 않은 문자 중 한
개와 매치
[^abc456]
[…-…] 영역 지정 문자 클래
스
클래스 내 문자 영역을 지정 [A-Za-z0-9]
19
정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 )
클래스 약어
메타문자 이 름 설 명 비 고 예 시
\ r CR(CarriageReturn) 현재 줄의 맨 앞으로
커서 이동하는 CR 에
매치
\ n LF(Line Feed) 다음 칸으로 커서 이
동하는 LF 에 매치
\ t HT(Horizontal Tab) 탭에 매치
\ s [● \ t] 모든 공백문자에 매
치
\ S [^● \ t] 공백문자가 아닌 모
든 문자에 매치
\ w [a-zA-Z0-9_] 문자 , 숫자 , under
bar 에 매치
\ W [^a-zA-Z0-9_] 문자 , 숫자 , under
bar 가 아닌 모든 문
자 및 공백에 매치
\ d [0-9] 모든 숫자에 매치
\ D [^0-9] 숫자가 아닌 모든 문
자 및 공백에 매치
20
정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 )
POSIX 문자 클래스
메타문자 이 름 설 명 비 고 예 시
\ r CR(CarriageReturn) 현재 줄의 맨 앞으로
커서 이동하는 CR 에
매치
\ n LF(Line Feed) 다음 칸으로 커서 이
동하는 LF 에 매치
\ t HT(Horizontal Tab) 탭에 매치
\ s [● \ t] 모든 공백문자에 매
치
\ S [^● \ t] 공백문자가 아닌 모
든 문자에 매치
\ w [a-zA-Z0-9_] 문자 , 숫자 , under
bar 에 매치
\ W [^a-zA-Z0-9_] 문자 , 숫자 , under
bar 가 아닌 모든 문
자 및 공백에 매치
\ d [0-9] 모든 숫자에 매치
\ D [^0-9] 숫자가 아닌 모든 문
자 및 공백에 매치
21
정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 )
앵커
메타문자 이 름 설 명 비 고 예 시
\ r CR(CarriageReturn) 현재 줄의 맨 앞으로
커서 이동하는 CR 에
매치
\ n LF(Line Feed) 다음 칸으로 커서 이
동하는 LF 에 매치
\ t HT(Horizontal Tab) 탭에 매치
\ s [● \ t] 모든 공백문자에 매
치
\ S [^● \ t] 공백문자가 아닌 모
든 문자에 매치
\ w [a-zA-Z0-9_] 문자 , 숫자 , under
bar 에 매치
\ W [^a-zA-Z0-9_] 문자 , 숫자 , under
bar 가 아닌 모든 문
자 및 공백에 매치
\ d [0-9] 모든 숫자에 매치
\ D [^0-9] 숫자가 아닌 모든 문
자 및 공백에 매치
22
정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 )
Quantifier
메타문자 이 름 설 명 비 고 예 시
\ r CR(CarriageReturn) 현재 줄의 맨 앞으로
커서 이동하는 CR 에
매치
\ n LF(Line Feed) 다음 칸으로 커서 이
동하는 LF 에 매치
\ t HT(Horizontal Tab) 탭에 매치
\ s [● \ t] 모든 공백문자에 매
치
\ S [^● \ t] 공백문자가 아닌 모
든 문자에 매치
\ w [a-zA-Z0-9_] 문자 , 숫자 , under
bar 에 매치
\ W [^a-zA-Z0-9_] 문자 , 숫자 , under
bar 가 아닌 모든 문
자 및 공백에 매치
\ d [0-9] 모든 숫자에 매치
\ D [^0-9] 숫자가 아닌 모든 문
자 및 공백에 매치
23
정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 )
그룹 지정 , 캡쳐 , 선택 , 백레퍼런스
메타문자 이 름 설 명 비 고 예 시
\ r CR(CarriageReturn) 현재 줄의 맨 앞으로
커서 이동하는 CR 에
매치
\ n LF(Line Feed) 다음 칸으로 커서 이
동하는 LF 에 매치
\ t HT(Horizontal Tab) 탭에 매치
\ s [● \ t] 모든 공백문자에 매
치
\ S [^● \ t] 공백문자가 아닌 모
든 문자에 매치
\ w [a-zA-Z0-9_] 문자 , 숫자 , under
bar 에 매치
\ W [^a-zA-Z0-9_] 문자 , 숫자 , under
bar 가 아닌 모든 문
자 및 공백에 매치
\ d [0-9] 모든 숫자에 매치
\ D [^0-9] 숫자가 아닌 모든 문
자 및 공백에 매치
24
정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 )
Look Around
메타문자 이 름 설 명 비 고 예 시
\ r CR(CarriageReturn) 현재 줄의 맨 앞으로
커서 이동하는 CR 에
매치
\ n LF(Line Feed) 다음 칸으로 커서 이
동하는 LF 에 매치
\ t HT(Horizontal Tab) 탭에 매치
\ s [● \ t] 모든 공백문자에 매
치
\ S [^● \ t] 공백문자가 아닌 모
든 문자에 매치
\ w [a-zA-Z0-9_] 문자 , 숫자 , under
bar 에 매치
\ W [^a-zA-Z0-9_] 문자 , 숫자 , under
bar 가 아닌 모든 문
자 및 공백에 매치
\ d [0-9] 모든 숫자에 매치
\ D [^0-9] 숫자가 아닌 모든 문
자 및 공백에 매치
25
정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 )
모드 변경자
메타문자 이 름 설 명 비 고 예 시
\ r CR(CarriageReturn) 현재 줄의 맨 앞으로
커서 이동하는 CR 에
매치
\ n LF(Line Feed) 다음 칸으로 커서 이
동하는 LF 에 매치
\ t HT(Horizontal Tab) 탭에 매치
\ s [● \ t] 모든 공백문자에 매
치
\ S [^● \ t] 공백문자가 아닌 모
든 문자에 매치
\ w [a-zA-Z0-9_] 문자 , 숫자 , under
bar 에 매치
\ W [^a-zA-Z0-9_] 문자 , 숫자 , under
bar 가 아닌 모든 문
자 및 공백에 매치
\ d [0-9] 모든 숫자에 매치
\ D [^0-9] 숫자가 아닌 모든 문
자 및 공백에 매치
26
정규표현식의 활용
Java
Perl
vi
grep/egrep
awk/gawk
Tool
Eclipse
Ultraedit
27
정규표현식의 활용 - vi
28
정규표현식의 활용 – grep/egrep/fgrep
29
정규표현식의 활용 – sed
30
정규표현식의 활용 – awk
31
정규표현식의 활용 – perl
32
정규표현식의 활용 - JAVA
java.util.regex package
- Java 1.4 버전부터 포함
ASCII class – ASCII 코드 , POSIX 클래스의 식이 상수로 정의
MatchResult Interface -
Matcher class – MatchResult Interface 의 구현
Pattern class
PatternSyntaxException
33
정규표현식의 활용 - JAVA
String class –
boolean matches(String regex) – String 이 정규표현식과 일치하는지
확인 (Pattern.matches(regex, String) 와 일치 )
ex > “-911”.matches(“-? \\ d+”); => true
“+911”.matches(“-? \\ d+”); => false
String[] split(String regex, int limit) – 정규표현식 (regex) 을 분리
자로 선택하여 배열을 넘겨 받음
Ex> “Tonight Is The Night”.split(“[in]”);
=> To, ,ght Is The N,ght ( 총 4 개로 분할 )
String replaceFirst(String regex, String replacement)
String replaceAll(String regex, String replacement)
Ex> “Tonight Is The Night”.replaceAll(“(?i)night(?-i)”, “morning”);
=> Tomorning is The morning
34
정규표현식의 활용 - JAVA
Pattern class –
상수 정의
Pattern.CASE_INSENSITIVE – 대소문자 구분 (?i)…(?-i)
Pattern.COMMENTS – 주석 사용할 수 있음 (?x)…(?-x)
Pattern.MULTILINE – 원래 ^ $ 은 입력 전체 문자열의 시작과 끝에만 매치되지만 , 라인의 시작과 끝에도 매치됨
Pattern.LITERAL – 정규표현식을 문자형리터럴로 표시한다 . Q...E
Pattern.DOTALL - . 이 모든 문자와 매치되며 , n 에도 매치됨 (?s)…(?-s)
static Pattern compile(String regex, int flags) – 정규표현식을 컴파일하여 정규표현식 Pattern 객체를 생성
Ex> Pattern.compile(“regex”, Pattern.CASE_INSENTIVE);
(= Pattern.compile(“(?i)regex(?-i)”);)
String pattern()
Matcher matcher(CharSequence input)
static boolean matches(String regex, CharSequence input) – 완전일치해야 true
String[] split(CharSequence input, int limit)
String quote(String s)
35
정규표현식의 활용 - JAVA
Matcher class –
Pattern pattern()
MatchResult toMatchResult()
Matcher usePattern(Pattern newPattern)
int start() – 매치된 문자열이 저장된 그룹 (matchObj.group()) 의 시작위치
int end() – 매치된 문자열이 저장된 그룹 (matchObj.group()) 의의 끝위치
String group() – group(0) 과 같음
String group(int group) – 저장된 그룹 ( 백레퍼런스 ) 를 리턴
int groupCount() – 저장된 그룹 ( 백레퍼런스 ) 의 개수를 리턴
boolean matches() – matchObj.matches(); 매치가 되는 행인지 확인 – 완전히 일치해야만 true
boolean find() – 다음 매치가 있는지 확인하면서 인덱스를 늘임
String quoteReplacement(String s)
String replaceAll(String replacement)
Matcher region(int start, int end)
regionStart()
regionEnd()
36
정규표현식의 활용 - eclipse
37
정규표현식의 활용 - UltraEdit
38
효율적인 정규표현식의 사용
NFA 엔진에서의 효율적인 사용법
* NFA 엔진은 백트랙킹을 사용한다 !!
39
정규표현식 실습
IP 주소 매치
192.168.57.67
1.[0-9] *\ .[0-9] *\ . [0-9] *\ . [0-9] * ( \ d *\ . \ d *\ . \ d *
\ . \ d * )
-> …. 에도 매치 , 숫자는 한자리 이상 되야 하므로
2. [0-9]+ \ . [0-9]+ \ . [0-9]+ \ . [0-9]+ ( \ d+ \ . \ d+ \ . \
d+ \ . \ d+)
-> 55555.55555.55555.55555 에도 매치
3. [012] \ d \ d \ . [012] \ d \ d \ . [012] \ d \ d
-> 299.299.299.299 에도 매치
4. ([01]? \ d \ d?|2[0-5][0-5]) \ .([01]? \ d \ d?|2[0-5][0-5]) \ .
([01]? \ d \ d?|2[0-5][0-5]) \ .([01]? \ d \ d?|2[0-5][0-5])
감사합니다
감사합니다

More Related Content

What's hot

The C++ Programming Language 5장 포인터, 배열, 구조체
The C++ Programming Language 5장 포인터, 배열, 구조체The C++ Programming Language 5장 포인터, 배열, 구조체
The C++ Programming Language 5장 포인터, 배열, 구조체
해강
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버
Jaejin Yun
 
[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명
종빈 오
 
포인터와 배열
포인터와 배열포인터와 배열
포인터와 배열
Kim YoSep
 
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
tcaesvk
 

What's hot (20)

Lua 문법
Lua 문법Lua 문법
Lua 문법
 
변수 이름의 효과
변수 이름의 효과변수 이름의 효과
변수 이름의 효과
 
The C++ Programming Language 5장 포인터, 배열, 구조체
The C++ Programming Language 5장 포인터, 배열, 구조체The C++ Programming Language 5장 포인터, 배열, 구조체
The C++ Programming Language 5장 포인터, 배열, 구조체
 
Aho-Corasick Algorithm(아호 코라식 알고리즘)
Aho-Corasick Algorithm(아호 코라식 알고리즘)Aho-Corasick Algorithm(아호 코라식 알고리즘)
Aho-Corasick Algorithm(아호 코라식 알고리즘)
 
9. pointer
9. pointer9. pointer
9. pointer
 
Lua script
Lua scriptLua script
Lua script
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버
 
포인터의 기초(1)
포인터의 기초(1)포인터의 기초(1)
포인터의 기초(1)
 
3.포인터
3.포인터3.포인터
3.포인터
 
Ch05
Ch05Ch05
Ch05
 
Erlang
ErlangErlang
Erlang
 
포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1
 
(Lisp)
(Lisp)(Lisp)
(Lisp)
 
4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터
 
Lua 문법 -함수
Lua 문법 -함수Lua 문법 -함수
Lua 문법 -함수
 
[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명[TAOCP] 1.3.1 MIX 설명
[TAOCP] 1.3.1 MIX 설명
 
포인터와 배열
포인터와 배열포인터와 배열
포인터와 배열
 
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
 
Python_numpy_pandas_matplotlib 이해하기_20160815
Python_numpy_pandas_matplotlib 이해하기_20160815Python_numpy_pandas_matplotlib 이해하기_20160815
Python_numpy_pandas_matplotlib 이해하기_20160815
 
C수업자료
C수업자료C수업자료
C수업자료
 

Viewers also liked

Viewers also liked (10)

[2012 11 12]애자일 회고
[2012 11 12]애자일 회고[2012 11 12]애자일 회고
[2012 11 12]애자일 회고
 
Slipp clojure-1212
Slipp clojure-1212Slipp clojure-1212
Slipp clojure-1212
 
Slipp 발표 자료 20151212
Slipp 발표 자료 20151212Slipp 발표 자료 20151212
Slipp 발표 자료 20151212
 
영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA
 
Scala로의 산책
Scala로의 산책Scala로의 산책
Scala로의 산책
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
Slipp 발표 - GO
Slipp 발표 - GOSlipp 발표 - GO
Slipp 발표 - GO
 
스크럼, 이걸 왜 하나요
스크럼, 이걸 왜 하나요스크럼, 이걸 왜 하나요
스크럼, 이걸 왜 하나요
 
SLiPP 스터디 - MSA
SLiPP 스터디 - MSASLiPP 스터디 - MSA
SLiPP 스터디 - MSA
 
Victoria's Secret Angels Campaign
Victoria's Secret Angels CampaignVictoria's Secret Angels Campaign
Victoria's Secret Angels Campaign
 

More from 오석 한 (14)

Smart work
Smart workSmart work
Smart work
 
RPC protocols
RPC protocolsRPC protocols
RPC protocols
 
Serialization (Avro, Message Pack, Kryo)
Serialization (Avro, Message Pack, Kryo)Serialization (Avro, Message Pack, Kryo)
Serialization (Avro, Message Pack, Kryo)
 
Cassandra
CassandraCassandra
Cassandra
 
Smart Phone CPU
Smart Phone CPUSmart Phone CPU
Smart Phone CPU
 
Functional progrmming with scala
Functional progrmming with scalaFunctional progrmming with scala
Functional progrmming with scala
 
Linux tips
Linux tipsLinux tips
Linux tips
 
Apache Click
Apache ClickApache Click
Apache Click
 
JAVA NIO
JAVA NIOJAVA NIO
JAVA NIO
 
예제로 쉽게 배우는 Log4j 기초 활용법
예제로 쉽게 배우는 Log4j 기초 활용법예제로 쉽게 배우는 Log4j 기초 활용법
예제로 쉽게 배우는 Log4j 기초 활용법
 
Vi 단축키명령어
Vi 단축키명령어Vi 단축키명령어
Vi 단축키명령어
 
Perl Script Document
Perl Script DocumentPerl Script Document
Perl Script Document
 
Perl Script
Perl ScriptPerl Script
Perl Script
 
정규 표현식 기본 메타문자 요약
정규 표현식 기본 메타문자 요약정규 표현식 기본 메타문자 요약
정규 표현식 기본 메타문자 요약
 

정규표현식의 이해와 활용

  • 1. 정규 표현식의 이해와 활용 한오석 , 커뮤니티 SU, 커뮤니티개발 1 팀 2008-08-28
  • 2. 2 목표 정규표현식을 쉽게 읽고 쓸 수 있으며 , 업무에 있어서 친숙하게 사용할 수 있는 계기를 마련한 다 . 정규표현식의 간단한 사용법을 통해 정규표현식을 사용해야 하는 이유를 전한다 . 정규표현식의 역사와 엔진 종류 및 매치 방식을 통해 정규표현식의 이해도를 높인다 . 기분문법과 언어별 차이를 중심으로 기본지식을 다진다 . 효율적인 정규표현식의 활용법을 설명함으로써 업무에 활용할 수 있는 다양한 방법을 제시한 다 . 실습을 통해 정규표현식이 더욱 친숙해 질 수 있는 계기를 마련한다 .
  • 3. 3 목차 정규 표현식의 이해 정규표현식의 소개 ( 정규표현식의 정의와 정규표현식을 사용하는 이유 ) 정규표현식의 역사 ( 정규표현식의 역사를 통한 발전과정 및 종류의 이 해 ) 정규표현식 엔진 및 매치 ( 정규표현식 엔진 소개와 매치방식 이해 ) 정규표현식 기본문법 ( 기본문법과 언어별 차이의 이해 ) 정규 표현식의 활용 정규표현식의 활용 ( 스크립트 언어 , java, 개발툴에서의 활용 ) 효율적인 정규표현식의 사용 ( 최적화 매치 방식 , 벤치마킹 ) 실습
  • 4. 4 정규표현식의 소개 정규 표현식 (Regular Expreesion) – 메타문자 (metacharacters) 의 문자 집합
  • 5. 5 정규표현식의 소개 왜 정규 표현식과 친해져야 하는가 ?
  • 6. 6 정규표현식의 역사 유래 – 오토마타 이론 (automata theory) 과 형식언어 이론 (formal language theory) 1950s – 수학자 Stephen Cole Kleene 이 그의 수학적 모델이름을 Regular sets 라 명명 1968 – Ken Thompson “ 정규 표현식 검색 알고리즘” 논문 발표 , UNIX qed 에디터 (ed 에디터의 전신 ) 에 적용시키며 전산분야에 응용되기 시작 1970s – ed 에디터의 g/regex/p( 정규식에 매치되는 행을 출력하는 명령 어 ) 기능을 이용하여 grep (Global Regular Expression Print) 유틸리 티 개발 이후 egrep, awk, sed 등을 통해 발전 1986 – POSIX (Portable Operating System Interface) 발표 1987 – Larry Wall 이 sed 와 awk 의 정규 표현식용 프로그램의 전통을 계승한 perl 발표 2002 – java 1.4 버전 java.util.regex 제공
  • 7. 7 정규표현식의 역사 POSIX (Portable Operating System Interface) - 운영 체제 사이의 이식성을 위해 발효된 광범위한 표준 - 정규 표현식의 혼란스러운 상황을 추스리기 위해 정규 표현식을 두 가지 유형 (BRE, ERE) 으로 분류 - Locale 개념의 지원 날짜 , 시각 , 화펴등 문자 해석은 같으나 문화적 관습에 따라 달라지는 것들을 모아 놓음 ex)
  • 8. 8 정규표현식 엔진 및 매치 정규표현식 엔진 1.DFA (Deterministic Finite Automata, 결정적 유한 오토마타 ) 2.NFA (Nondeterministic Finite Automata, 비결정적 유한 오토마타 ) 3.POSIX NFA(POSIX 표준 NFA) 4.NFA/DFA 혼합형
  • 9. 9 정규표현식 엔진 및 매치 정규표현식 매치 1.가장 먼저 시작하는 ( 가장 왼쪽에 있는 ) 매치가 더 우선시 된다 . ex) The dragging belly indicates your cat is too fat (fat|cat|belly) 2. 표준수량자는 greedy quantifier 이다 .
  • 10. 10 정규표현식 엔진 및 매치 – DFA (Deterministic Finite Automata) DFA (Deterministic Finite Automata, 결정적 유한 오토마타 ) 사용되는 프로그램 : awk, egrep, flex, lex, MySQL, Procmail 특징 : 텍스트 중심 엔진 매치 방법이 매우 빠름 매치 방법이 일관적임 | - 최대길이에 매치됨
  • 11. 11 정규표현식 엔진 및 매치 – DFA (Deterministic Finite Automata) Text : Come back tonight at 9 o’clock Regex : to(nig|knight|night) C b a c k t o n i g h t a t 9 o’clock t o ( n n i g h ti n i g h tk| | ) o m e o m et g
  • 12. 12 정규표현식 엔진 및 매치 – NFA (Nondeterministic Finite Automata) NFA (Nondeterministic Finite Automata, 비결정적 유한 오토마타 ) 사용되는 프로그램 : Java, Perl, sed, vi, grep, less, more, PHP, Python, Ruby, GNU Emacs, CRE 라이브러리 , .net 특징 : 정규 표현식 중심 엔진 백트래킹 (Backtracking) 을 사용하여 매치 | - 최소길이에 매치됨
  • 13. 13 정규표현식 엔진 및 매치 – NFA (Nondeterministic Finite Automata) Text : Come back tonight at 9 o’clock Regex : to(nig|knight|night) C b a c k t o n i g h t a t 9 o’clock t o ( n n i g h ti n i g h tk| | ) o m e o m et g
  • 14. 14 정규표현식 엔진 및 매치 – NFA (Nondeterministic Finite Automata) Text : Come back tonight at 9 o’clock Regex : to(night|knight|nig) C b a c k t o n i g h t a t 9 o’clock t o ( n n i g h ti n i gh t k| | ) o m e o m et g
  • 15. 15 정규표현식 엔진 및 매치 – NFA (Nondeterministic Finite Automata)
  • 16. 16 정규표현식 엔진 및 매치 – POSIX NFA(POSIX 표준 NFA) POSIX NFA(POSIX 표준 NFA) 사용되는 프로그램 : mawk, GNU Emacs
  • 17. 17 정규표현식 엔진 및 매치 – NFA/DFA 혼합형 NFA/DFA 혼합형 사용되는 프로그램 : GUN awk, GNU grep/egrep, Tcl
  • 18. 18 정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 ) 일반 클래스 메타문자 이 름 설 명 예시 […] 문자 클래스 클래스 내 열거된 문자 중 한 개와 매 치 [ABC123] [^…] 부정형 문자 클래스 클래스 내 열거되지 않은 문자 중 한 개와 매치 [^abc456] […-…] 영역 지정 문자 클래 스 클래스 내 문자 영역을 지정 [A-Za-z0-9]
  • 19. 19 정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 ) 클래스 약어 메타문자 이 름 설 명 비 고 예 시 \ r CR(CarriageReturn) 현재 줄의 맨 앞으로 커서 이동하는 CR 에 매치 \ n LF(Line Feed) 다음 칸으로 커서 이 동하는 LF 에 매치 \ t HT(Horizontal Tab) 탭에 매치 \ s [● \ t] 모든 공백문자에 매 치 \ S [^● \ t] 공백문자가 아닌 모 든 문자에 매치 \ w [a-zA-Z0-9_] 문자 , 숫자 , under bar 에 매치 \ W [^a-zA-Z0-9_] 문자 , 숫자 , under bar 가 아닌 모든 문 자 및 공백에 매치 \ d [0-9] 모든 숫자에 매치 \ D [^0-9] 숫자가 아닌 모든 문 자 및 공백에 매치
  • 20. 20 정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 ) POSIX 문자 클래스 메타문자 이 름 설 명 비 고 예 시 \ r CR(CarriageReturn) 현재 줄의 맨 앞으로 커서 이동하는 CR 에 매치 \ n LF(Line Feed) 다음 칸으로 커서 이 동하는 LF 에 매치 \ t HT(Horizontal Tab) 탭에 매치 \ s [● \ t] 모든 공백문자에 매 치 \ S [^● \ t] 공백문자가 아닌 모 든 문자에 매치 \ w [a-zA-Z0-9_] 문자 , 숫자 , under bar 에 매치 \ W [^a-zA-Z0-9_] 문자 , 숫자 , under bar 가 아닌 모든 문 자 및 공백에 매치 \ d [0-9] 모든 숫자에 매치 \ D [^0-9] 숫자가 아닌 모든 문 자 및 공백에 매치
  • 21. 21 정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 ) 앵커 메타문자 이 름 설 명 비 고 예 시 \ r CR(CarriageReturn) 현재 줄의 맨 앞으로 커서 이동하는 CR 에 매치 \ n LF(Line Feed) 다음 칸으로 커서 이 동하는 LF 에 매치 \ t HT(Horizontal Tab) 탭에 매치 \ s [● \ t] 모든 공백문자에 매 치 \ S [^● \ t] 공백문자가 아닌 모 든 문자에 매치 \ w [a-zA-Z0-9_] 문자 , 숫자 , under bar 에 매치 \ W [^a-zA-Z0-9_] 문자 , 숫자 , under bar 가 아닌 모든 문 자 및 공백에 매치 \ d [0-9] 모든 숫자에 매치 \ D [^0-9] 숫자가 아닌 모든 문 자 및 공백에 매치
  • 22. 22 정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 ) Quantifier 메타문자 이 름 설 명 비 고 예 시 \ r CR(CarriageReturn) 현재 줄의 맨 앞으로 커서 이동하는 CR 에 매치 \ n LF(Line Feed) 다음 칸으로 커서 이 동하는 LF 에 매치 \ t HT(Horizontal Tab) 탭에 매치 \ s [● \ t] 모든 공백문자에 매 치 \ S [^● \ t] 공백문자가 아닌 모 든 문자에 매치 \ w [a-zA-Z0-9_] 문자 , 숫자 , under bar 에 매치 \ W [^a-zA-Z0-9_] 문자 , 숫자 , under bar 가 아닌 모든 문 자 및 공백에 매치 \ d [0-9] 모든 숫자에 매치 \ D [^0-9] 숫자가 아닌 모든 문 자 및 공백에 매치
  • 23. 23 정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 ) 그룹 지정 , 캡쳐 , 선택 , 백레퍼런스 메타문자 이 름 설 명 비 고 예 시 \ r CR(CarriageReturn) 현재 줄의 맨 앞으로 커서 이동하는 CR 에 매치 \ n LF(Line Feed) 다음 칸으로 커서 이 동하는 LF 에 매치 \ t HT(Horizontal Tab) 탭에 매치 \ s [● \ t] 모든 공백문자에 매 치 \ S [^● \ t] 공백문자가 아닌 모 든 문자에 매치 \ w [a-zA-Z0-9_] 문자 , 숫자 , under bar 에 매치 \ W [^a-zA-Z0-9_] 문자 , 숫자 , under bar 가 아닌 모든 문 자 및 공백에 매치 \ d [0-9] 모든 숫자에 매치 \ D [^0-9] 숫자가 아닌 모든 문 자 및 공백에 매치
  • 24. 24 정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 ) Look Around 메타문자 이 름 설 명 비 고 예 시 \ r CR(CarriageReturn) 현재 줄의 맨 앞으로 커서 이동하는 CR 에 매치 \ n LF(Line Feed) 다음 칸으로 커서 이 동하는 LF 에 매치 \ t HT(Horizontal Tab) 탭에 매치 \ s [● \ t] 모든 공백문자에 매 치 \ S [^● \ t] 공백문자가 아닌 모 든 문자에 매치 \ w [a-zA-Z0-9_] 문자 , 숫자 , under bar 에 매치 \ W [^a-zA-Z0-9_] 문자 , 숫자 , under bar 가 아닌 모든 문 자 및 공백에 매치 \ d [0-9] 모든 숫자에 매치 \ D [^0-9] 숫자가 아닌 모든 문 자 및 공백에 매치
  • 25. 25 정규표현식 기본문법 – 문자클래스 ( 대괄호 표현식 ) 모드 변경자 메타문자 이 름 설 명 비 고 예 시 \ r CR(CarriageReturn) 현재 줄의 맨 앞으로 커서 이동하는 CR 에 매치 \ n LF(Line Feed) 다음 칸으로 커서 이 동하는 LF 에 매치 \ t HT(Horizontal Tab) 탭에 매치 \ s [● \ t] 모든 공백문자에 매 치 \ S [^● \ t] 공백문자가 아닌 모 든 문자에 매치 \ w [a-zA-Z0-9_] 문자 , 숫자 , under bar 에 매치 \ W [^a-zA-Z0-9_] 문자 , 숫자 , under bar 가 아닌 모든 문 자 및 공백에 매치 \ d [0-9] 모든 숫자에 매치 \ D [^0-9] 숫자가 아닌 모든 문 자 및 공백에 매치
  • 32. 32 정규표현식의 활용 - JAVA java.util.regex package - Java 1.4 버전부터 포함 ASCII class – ASCII 코드 , POSIX 클래스의 식이 상수로 정의 MatchResult Interface - Matcher class – MatchResult Interface 의 구현 Pattern class PatternSyntaxException
  • 33. 33 정규표현식의 활용 - JAVA String class – boolean matches(String regex) – String 이 정규표현식과 일치하는지 확인 (Pattern.matches(regex, String) 와 일치 ) ex > “-911”.matches(“-? \\ d+”); => true “+911”.matches(“-? \\ d+”); => false String[] split(String regex, int limit) – 정규표현식 (regex) 을 분리 자로 선택하여 배열을 넘겨 받음 Ex> “Tonight Is The Night”.split(“[in]”); => To, ,ght Is The N,ght ( 총 4 개로 분할 ) String replaceFirst(String regex, String replacement) String replaceAll(String regex, String replacement) Ex> “Tonight Is The Night”.replaceAll(“(?i)night(?-i)”, “morning”); => Tomorning is The morning
  • 34. 34 정규표현식의 활용 - JAVA Pattern class – 상수 정의 Pattern.CASE_INSENSITIVE – 대소문자 구분 (?i)…(?-i) Pattern.COMMENTS – 주석 사용할 수 있음 (?x)…(?-x) Pattern.MULTILINE – 원래 ^ $ 은 입력 전체 문자열의 시작과 끝에만 매치되지만 , 라인의 시작과 끝에도 매치됨 Pattern.LITERAL – 정규표현식을 문자형리터럴로 표시한다 . Q...E Pattern.DOTALL - . 이 모든 문자와 매치되며 , n 에도 매치됨 (?s)…(?-s) static Pattern compile(String regex, int flags) – 정규표현식을 컴파일하여 정규표현식 Pattern 객체를 생성 Ex> Pattern.compile(“regex”, Pattern.CASE_INSENTIVE); (= Pattern.compile(“(?i)regex(?-i)”);) String pattern() Matcher matcher(CharSequence input) static boolean matches(String regex, CharSequence input) – 완전일치해야 true String[] split(CharSequence input, int limit) String quote(String s)
  • 35. 35 정규표현식의 활용 - JAVA Matcher class – Pattern pattern() MatchResult toMatchResult() Matcher usePattern(Pattern newPattern) int start() – 매치된 문자열이 저장된 그룹 (matchObj.group()) 의 시작위치 int end() – 매치된 문자열이 저장된 그룹 (matchObj.group()) 의의 끝위치 String group() – group(0) 과 같음 String group(int group) – 저장된 그룹 ( 백레퍼런스 ) 를 리턴 int groupCount() – 저장된 그룹 ( 백레퍼런스 ) 의 개수를 리턴 boolean matches() – matchObj.matches(); 매치가 되는 행인지 확인 – 완전히 일치해야만 true boolean find() – 다음 매치가 있는지 확인하면서 인덱스를 늘임 String quoteReplacement(String s) String replaceAll(String replacement) Matcher region(int start, int end) regionStart() regionEnd()
  • 38. 38 효율적인 정규표현식의 사용 NFA 엔진에서의 효율적인 사용법 * NFA 엔진은 백트랙킹을 사용한다 !!
  • 39. 39 정규표현식 실습 IP 주소 매치 192.168.57.67 1.[0-9] *\ .[0-9] *\ . [0-9] *\ . [0-9] * ( \ d *\ . \ d *\ . \ d * \ . \ d * ) -> …. 에도 매치 , 숫자는 한자리 이상 되야 하므로 2. [0-9]+ \ . [0-9]+ \ . [0-9]+ \ . [0-9]+ ( \ d+ \ . \ d+ \ . \ d+ \ . \ d+) -> 55555.55555.55555.55555 에도 매치 3. [012] \ d \ d \ . [012] \ d \ d \ . [012] \ d \ d -> 299.299.299.299 에도 매치 4. ([01]? \ d \ d?|2[0-5][0-5]) \ .([01]? \ d \ d?|2[0-5][0-5]) \ . ([01]? \ d \ d?|2[0-5][0-5]) \ .([01]? \ d \ d?|2[0-5][0-5])

Editor's Notes

  1. Private Pattern(String p, int f)이기 때문에 static 써야함 String split, matches(똑같다)와 차이점은 무엇일까?