1. 정규 표현식의 이해와 활용
한오석 , 커뮤니티 SU, 커뮤니티개발 1 팀 2008-08-28
2. 2
목표
정규표현식을 쉽게 읽고 쓸 수 있으며 , 업무에 있어서 친숙하게 사용할 수 있는 계기를 마련한
다 .
정규표현식의 간단한 사용법을 통해 정규표현식을 사용해야 하는 이유를 전한다 .
정규표현식의 역사와 엔진 종류 및 매치 방식을 통해 정규표현식의 이해도를 높인다 .
기분문법과 언어별 차이를 중심으로 기본지식을 다진다 .
효율적인 정규표현식의 활용법을 설명함으로써 업무에 활용할 수 있는 다양한 방법을 제시한
다 .
실습을 통해 정규표현식이 더욱 친숙해 질 수 있는 계기를 마련한다 .
3. 3
목차
정규 표현식의 이해
정규표현식의 소개 ( 정규표현식의 정의와 정규표현식을 사용하는 이유 )
정규표현식의 역사 ( 정규표현식의 역사를 통한 발전과정 및 종류의 이
해 )
정규표현식 엔진 및 매치 ( 정규표현식 엔진 소개와 매치방식 이해 )
정규표현식 기본문법 ( 기본문법과 언어별 차이의 이해 )
정규 표현식의 활용
정규표현식의 활용 ( 스크립트 언어 , java, 개발툴에서의 활용 )
효율적인 정규표현식의 사용 ( 최적화 매치 방식 , 벤치마킹 )
실습
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()