정규표현식은 문자열의 일정한 패턴을 찾던지 치환하여 주는 기능을 가지고 있다.
메일 주소검사라던지, 소수점 몇째자리 까지 끊어서 보여주기 등.. 더욱더 복잡한
문자열도 이 정규표현식으로 처리할수 있다....
이는 프로그램시에 많은 일을 쉽게 처리하여 준다 (대부분 내장함수에도 있네요...)
특히 웹에서는 폼값을 처리할때 특정폼의 형식이 원하는 형식에 맞는지 검사할때
많이 쓰일수 있다. 정규표현식은 거의 모든 언어에서 지원하지만 사용법은 조금씩
다르다. 하지만 크게 다르지 않으므로 익혀놓으면 많은 도움이 되리라 생각된다.
**아래의 글은 몇가지 문서를 참고하였으며 정규표현식의 모든것을 포함하지는
않는다.
정규식에 사용되는 기호
^ (caret) 문장의 시작
$ (dollar) 문장의 끝
. (period) 줄바꿈 또는 단일문자 ex) h.t => hat, hothit, hut, h7t. 등 검출
[] (bracket) 문자의 집합이나 범위를 나타냄, 두 문자 사이에 – 는 범위를 나타냄
{} (braced) {} 내의 숫자는 직전의 선행 문자 수를 나타냄
* (asterisk) 직전의 선행문자가 0번 또는 그이상 나타냄
+ (asterisk) 직전의 선행문자가 1번 이상 나타냄
? (asterisk) 직전의 선행문자가 0번 또는 1번 나타냄
| (bar) or 을 나타냄
\ (backslash) 위에서 사용하는 특수문자를 정규식내에서 문자로 취급하고 싶을 때 \를 선행 기술
예1)
abc abc 가 있는 것
^abc abc 로 시작하는 것
abc$ abc 로 끝나는 것
^abc$ abc 로 시작하고 끝나는 것
[abc] a,b,c 전부중 하나 포함한 경우
[a-z] a 에서 z 중 하나 포함한 경우
^[0-9] 숫자 0~9 아무 숫자나 상관없으니 숫자로 시작하는 패턴을 찾는 것
[^0-9] 숫자가 들어있지 않는 패턴을 찾는 것
^[^0-9] 숫자가 들어있지 않는 문자로 시작하는 패턴을 찾는 것
a{3} a 의 3번 반복인 aaa 인 것
a{3,} a 가 3번 이상 반복인 것, aaa, aaaa, aaaaa
[0-9]{2} 두자리 숫자
abc[7-9]{2} abc 포함 7에서 9까지 2자리 숫자 포함, abc77, abc78, abc97
============================================
편의상 반말을 한것에 대하여 양해를 구합니다.
============================================
정규표현식은 보통 eregi, eregi_replace, ereg, ereg_replace, 또는 perl 의 함수패턴을
그대로 사용할수 있도록 해놓은 함수 preg_match, preg_split, preg_quote 등의 함수
를 사용한다. (아마 perg 는 php 버전이 3.0.9 이상에서 사용가능할겁니다)
'^' 는 바로 문자뒤의 문자열로 시작 됨을 가르킨다.
"^The" : 는 "The"로 시작 하는 문자를 말한다.
'$' 는 문자열의 맨 마지막을 가르킨다.
"of despair$" : 는 "of despair"로 끝나는 문자열이다.
"^abc$" : 는 hello로 시작해 hello로 끝나는 경우 이므로 "abc" 만 해당된다..
2. '.' '*' '+' '?' 의 사용법
'.' 은 어떤 문자든지 임의의 한문자를 말한다.꼭 하나의 문자가 있어야 한다.
예) "x.z" 는 xyz, xxz, xbz 등이고 xz난 xyyz는 안된다.
'*' 는 바로 앞의 문자가 없거나 하나 이상의 경우를 말한다.
예) "ab*" 는 a, abc, ab, abbbb 등을 말한다.
'+' 는 바로 앞의 문자를 나타내면 꼭 1나 이상이어야 한다.
예) "ab+" 는 abc, abbb 등이고 a는 되지 않는다.
'?' 는 바로 앞의 한문자가 있거나 없는것을 말한다. 단지 한문자 만이어야 한다.
예) "ab?" 는 a 또는 ab 를 나타낸다.
3. [], {} 와 () 그리고 |
3-1 '[]' 는 [] 안에 존재하는 문자들중 한 문자만을 나타낸다.
예) [abc] 는 a 또는 b 또는 c 중에 한문자를 나타낸다. 여기서 '-'를 사용할땐 범위를 나타낸다.
즉 [ a-f ] 는 [abcdf] 와 같은것을 나타낸다.
문자클래스 오퍼레이터라는 것에 대해 잠시..
유사한 성격의 문자들을 사용자가 알아보기 쉽게 단어로 그룹을 지었다고 보면 된다.
alnum : 알파벳과 숫자
alpha : 알파벳
blank : 스페이스나 탭 (시스템에 의존적임)
cntrl : 아스키코드에서의 127 이상의 문자와 32 이하의 제어문자
(한글의 첫째바이트가 127 이상이므로 제어문자로 취급됨 :()
digit : 숫자
graph : 스페이스는 제외되고 나머지는 'print' 항목과 같음.
lower : 소문자
print : 아스키코드에서 32에서 126까지의 찍을 수 있는 문자
punct : 제어문자도 아니고 알파벳.숫자도 아닌 문자
space : 스페이스, 케리지 리턴, 뉴라인, 수직 탭, 폼피드
upper : 대문자
xdigit : 16진수, 0-9, a-f, A-F
[[:alnum:]]은 [a-zA-Z0-9] 와 같은 의미다.
[[:alpha:]]은 [a-zA-Z] 와 같은 의미다.
문자열 오퍼레이터는 [] 사이에서만 효력을 발휘한다.
그리고 반대의 의미도 가능하다.
[^[:alnum:]] 은 알파벳과 숫자의 조합이 아닌것을 말한다.
[^a-zA-Z0-9] 와 같이 사용될수도 있다.
'3-2 {}'는 {} 앞에 있는 문자나 문자열의 개수를 정하는 것이다.
예) "ab" 는 "abb"를 나타낸다. 즉 b의 개수가 2개를 나타낸다.
"ab{2,}" 는 abb, abbbbb 등 b의 개수가 2개 이상을 나타낸다.
"ab{3,5}" 는 abbb, abbbb, abbbbb 와 같이 b가 3개에서 5개 까지를 나타낸다.
3-3 '()' 는 ()안에 있는 글자들을 그룹화 한다.
예) a(bc)* 는 a, abc abcbc 등 'bc'가 없거나 하나 이상인 경우이다.
"a(bc)" 는 abcbc 를 나타낸다.
3-4 '|' 는 OR 연산자 기능을 한다.
"a|b" 는 a 또는 b 둘중 하나를 나타낸다.
참고할것은 기호인데 이것은 . (, ) 등 단지 다음에 오는것이 문자라는것을
의미한다. 어떤한 처리도 없이 문자로만 인식한다.
{1,3} 하고 하면 {1,3} 와는 다르다.
4. 기초 활용
"a(bc)*" 는 a라는 문자를 포함하고 bc라는 문자열이 없거나 계속반복되는 문자열이다.
이것은 a, abc ,abcbc abcbcbc.... 등의 문자열을 의미한다.
"a(bc){1,5}" 는 a 라는 문자를 포함하고 bc 라는 문자를 묶은 형태인데. bc 라는 문자가
한번에서 5번까지를 말한다. --말이 더 어렵다....
이것은 abc,abcbc,abcbc,abcbcbc,abcbcbcbc,abcbcbcbcbc 의 문자열을 의미한다.
^[1-9][0-9]*$ 는 자연수를 표시할수 있다.
^(0|[1-9][0-9]*)$ 는 0을 포함하는 자연수
^(0|-?[1-9][0-9]*)$ 정수표시
^[0-9]+(.[0-9]+)?$ 소숫점 표시
^[0-9]+(.[0-9])?$ 소수점 둘째자리 까지
^[0-9]+(.[0-9]{1,2})?$ 소수점 둘째자리나 첫째자리
^[0-9]{1,3}(,[0-9])*(.[0-9]{1,2})?$ 돈의 표시...
(센트까지 표시가능 예 2,200.20 : 이천이백이십센트 또는 이천이백이십전 맞나?)
5. 복합활용
5-1 메일 주소 체킹..
5-1-1 : 유저명@도메인명
유저명 : 대문자, 소문자, 숫자 그리고 '.' '-' '_' 을 가질 수있지만 . 로 시작해서는 안된다.
[_0-9a-zA-Z-]+(.[_0-9a-zA-Z]+)*
이때에는 eregi 를 사용할때까 아닌 ereg 를 사용할때이다. eregi 함수는 대소문자구분이 없다.
^[_a-z0-9-]+(.[_a-z0-9-]+)*$ eregi 함수를 사용할때...
5-1-2 : 도메인 : 유저명과 기본적으로는 같지만 _ 가 없다.
^[a-z0-9-]+(.[a-z0-9-]+)*$
문자 집합 : [] - 대괄호 사이에 찾고자 하는 문자들의 집합을 표기한다
예)
[0-9] : 0부터 9까지의 숫자 한 문자
[Aa] : A 혹은 a에 대응하는 한 문자
"-"(하이픈)은 문자 집합인 대괄호 안에서 만 문자의 범위를 지정하는 기호로 쓰인다.
제외 문자 : ^ (캐럿) - ^기호 뒤의 문자를 제외한 문자 (집합기호 - [] - 안에서 쓰일때)
예)
ns[^0-9] : nsx - ns다음의 x가 숫자가 아닌 한 문자에 대응
메타 문자 : 정규표현식에서 특별한 의미를 가지는 문자
정규표현식에서 메타문자 및 기호문자를 찾고자하는 문자에 대응하려면 "\"(escape)를 붙혀 사용한다.
모든 문자 : .(마침표) - 모든 문자에 대응되는 한 문자
공백 문자 : \n, \r, \t, \f-form feed, \v-vertical tab
특별한 문자 형태
숫자와 숫자 아닌문자 : \d - [0-9], \D - [^0-9]
영숫자 문자와 영숫자 문자가 아닌 문자 : \w - [a-zA-Z0-9_], \W - [^a-zA-Z0-9_]
반복찾기
+ : 한 문자 이상 - + 기호 앞으 문자가 하나 이상 반복
* : 문자가 없거나 하나 이상 반복
? : 문자가 없거나 하나와 대응하는 문자 예) https?// - s가 없거나 한번 있는 경우와 대응
반복회수 지정하기 : {} (중괄호) - 중괄호 앞의 문자에 대하여 반복회수 지정
반복회수 지정 : {반복회수} - 저정된 회수만큼 반복하는 경우 대응
예)
#[0-9A-Fa-f]{6} - 16진수 RGB표기
최소, 최대 반복회수 지정 : {최소, 최대} - 최소번 또는 최대번만 반복되는 경우 대응, 최소값에 0과 최대값의 생략 가능
예)
\d{1,2}[-\/]\d{1,2}[-\/]\d{2,4} - -또는 / 구분의 날짜 표기
greedy와 lazy 수량자
탐욕적 수량자 : +, *, {n,}
게으른 수량자 : +?, *?, {n,}?
예) abcd <b>xxx</b> and <b>yyy</b> efgh
greedy : <[Bb]>.*</[Bb]> --> <b>xxx</b> and <b>yyy</b>
lazy : <[Bb]>.*?</[Bb]> --> <b>xxx</b> 와 <b>yyy</b>
단어 경계 지정
단어 사이의 공백 : \b - 공백문자(space)와 일치하지만 공백을 일치하는 문자로 지정하지는 않는다. (\B - \b와 반대) --> 단어 사이의 구분자로 쓰임
실제 공백 문자를 찾을 때는 [ ]또는 \s를 활용한다.
시작 문자 지정 : ^(캐럿) - 제외 문자와 달리 표현식의 처음에 사용되어 다음에 나오는 문자를 시작하는 문자로 지정할 수 있다.
마지막 문자 지정 : $ - 앞에 나온 문자가 마지막에 일치할때
다중행 모드 : (?m)
지정한 문자열을 줄단위로 분리하여 표현식을 검색한다.
표현식의 가장 앞에 써준다.
다중행 모드 지정시 ^와 $를 지정단 문자열의 줄단위로 검색하는 것이 가능하다.
예) 라인단위 주석(//) 문자로 부터 해당 라인의 끝까지
(?m)^//.*$
하위 표현식 : () - 괄호
표현식 일부를 괄호로 묶어준다.
중첩 하위 표현식 : 괄호안에 괄호...
or 연산자 : | - | 기호의 좌우 둘중 하나가 일치하는 경우
예) 아이피 형식의 문자열
(\d{1,3}\.){3}\d{1,3}
(((\d{1,2})|(1\d{2}))|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2}))|(2[0-4]\d)|(25[0-5]))
역참조 : \1 ~ \9
표현식 중 하위 표현식의 순서와 지정한 번호가 해당 하위 표현식과 일치한다.
0번을 지정하면 해당 표현식 전부와 일치한다.
예) html의 <H1~6>태그의 내용 찾기
<Hh([1-6])>.*?</Hh\1>
전방탐색과 후방탐색 : 하위표현식으로 표현
전방탐색 : ?= - 지정한 전방 탐색 기호의 다음 표현식으로 부터 앞에 나오는 일치하는 문자를 찾는다.
후방탐색 : ?<= - 지저한 후방 탐색 기호의 다음 표현식으로 부터 뒤에 나오는 일치하는 문자를 찾는다.
예) html tag기회 내의 내용
(?<=<[Tt][Ii][Tt][Ll][Ee]>).*?(?=</[Tt][Ii][Tt][Ll][Ee]>)
부정형 전/후방 탐색 : 전방 - ?!, 후방 - ?<!
예) $로 시작하지 않는 숫자
\b(?!\$)\d+\b
조건 달기 : ?
? 앞의 문자(표현식)가 없거나 한번 일치할때 해당하는 앞으 문자(표현식)과 일치한다.
전후방 탐색(?=, ?<=)의 뒤에 나오는 표현식과 일치할때...
역참조 조건 : (?(backreference)true), (?(backreference)true|false)
backreference는 역참조 대상의 하위 표현식이며, \를 붙이지 않고 해당 하위 표현식 순서에 해당하는 번호를 지정한다.
예) IMG 태그나 이미지 태그를 싸고 있는 A태그
(<[Aa]\s+[^>]+>\s*)?<[Ii][Mm][Gg]\s+[^>]+>(?(1)\s*</[Aa])>)
예)
(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
전방 탐색 조건 : (?(?=condition)expressions)
예)
\d{5}(?(?=-)-\d{4})
* 유용한 정규 표현식 예
- IP : (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
o ?(1)은 역참조 1이 있는지 없는지를 검사한다. 역참조 번호를 조건에서 이스케이프 할 필요는 없다.
o 즉, ?(1)이 맞고, ?(\1)은 잘못된 것이다. 그렇지만 후자도 동작한다.
o (?(backreference)true|false)
o 전후방 탐색 조건
§ 전후방탐색 조건은 전방탐색과 후방탐색 명령이 성공했는지에 따라 표현식을 수행할지 결정한다.
§ 전후방탐색 조건은 역참조(괄호안에 넣는 숫자)가 완전히 전후방탐색 표현식으로 대체되었다는 점만 빼고는 역참조 조건과 동일하다.
§ 예제)
\d{5}(?(?=-)-\d{4})
o 하이픈이 있다는 조건을 만족하면, -\d{4}는 그 하이픈과 이어 나오는 숫자 네 개와 일치한다.
o 더 간단한 방법으로 비슷한 결과를 얻을 수 있기 때문에 전후방탐색 조건은 자주 사용하지 않는다.
1. 콤마( . )
. 는 어떤 문자 1개를 가리킨다. ( "줄바꿈 문자(\n)"는 제외)
====================================
표현식 h.t
문자열 hat halt hit heat hot
====================================
표현식 h..t
문자열 hat halt hit heat hot
====================================
2. 대괄호 [ ]
[ ] 는 안에 있는 문자중 하나를 가리킨다.
[abc] a,b,c 중 하나
[a-z] 알파벳 소문자 중 하나
[0-9] 숫자 중 하나
[a-zA-Z] 알파벳 소문자나 대문자 중 하나
====================================
표현식 h[aiu]t
문자열 hat het hit hot hut
====================================
3. 대괄호와 캐럿 [^ ]
[^ ] 은 안에 있는 문자를 제외한 문자중 하나를 가리킨다.
[^abc] a,b,c 이외의 문자 중 하나
[^a-z] 알파벳 소문자 이외의 문자 중 하나
[^0-9] 숫자 이외의 문자 중 하나
[^a-zA-Z] 알파벳 소문자나 대문자 이외의 문자 중 하나
====================================
표현식 h[^aiu]t
문자열 hat het hit hot hut
====================================
3. 별표( * )
* 는 바로 앞에 있는 문자가 0또는 그 이상 반복되는 것을 가리킨다.
====================================
표현식 ha*t
문자열 ht hit hat hot haat hut haaaaat
====================================
4. 플러스(+)
+ 는 바로 앞에 있는 문자가 1 또는 그 이상 반복되는 것을 가리킨다.
====================================
표현식 ha+t
문자열 ht hit hat hot haat hut haaaaat
====================================
5. 물음표( ?)
? 는 바로 앞에 있는 문자가 0또는 1번 반복되는 것을 가리킨다.
====================================
표현식 ha?t
문자열 ht hit hat hot haat hut haaaaat
====================================
6. {n}
{n} 은 바로 앞에 있는 문자가 n번 반복되는 것을 가리킨다.
====================================
표현식 ha{2}t
문자열 ht hit hat hot haat hut haaaaat
====================================
7. {n,}
{n,} 은 바로 앞에 있는 문자가 n번 이상 반복되는 것을 가리킨다.
{0,}는 별표(*)와 같은 의미이다.
{1,}는 더하기(+)와 같은 의미이다.
{0,1}는 물음표(?)와 같은 의미이다.
====================================
표현식 ha{2,}t
문자열 ht hit hat hot haat hut haaaaat
====================================
8. {n,m}
{n,m} 은 바로 앞에 있는 문자가 n번 이상, m번 이하 반복되는 것을 가리킨다.
====================================
표현식 ha{2,4}t
문자열 ht hat haat haaat haaaat haaaaat
====================================
9. 캐럿( ^)
^ 은 줄의 제일 처음(시작위치)을 가리킨다.
====================================
표현식 ^h.t
문자열 hat hit hot
====================================
10. 달러( $)
$ 는 줄의 제일 마지막(끝 위치)을 가리킨다.
====================================
표현식 h.t$
문자열 hat hit hot
====================================
11. Group ( )
특정 패턴을 묶어서 반복 기호등과 함께 사용.
여러 문자 중 하나만 선택적으로 매칭하고자 할 때 사용.
====================================
표현식 ba(na)*
문자열 ba na bana banana nana bananana
====================================
====================================
표현식 ba(na)+
문자열 ba na bana banana nana bananana
결 과 ba na wow wow nana wow
====================================
12. 선택 지정 ( | )
괄호로 묶인 그룹 내에서 | 으로 나뉘어진 여러 개의 패턴 중 하나와 일치하는 것을 가리킨다.
====================================
표현식 (eg|sa|be)g
문자열 egg eng sag sig beg bag
====================================
13. Group 참조 \숫자
Group으로 지정된 내용을 뒤에 ‘\숫자’의 형식으로 재 사용하는데 사용.
====================================
표현식 (h.t)\1
문자열 hathat hitbit hothot hutcut
====================================
14. 반복 문자 탐지 – Greedy, Lazy
반복 문자 개수를 지정하는 방법은 크게 Greedy방식과 Lazy방식으로 나뉘어진다.
Greedy 방식은 가능한 최대의 것을 선택하고, Lazy방식은 가능한 최소의 것을 선택한다.
Greedy 방식뒤에 ?을 붙이면 Lazy방식이 된다.
15.주요 Escape 문자 목록
\t 탭 문자, Tab, \u0009
\r 줄 바꿈 문자, Carriage Return, \u000D
\n 줄 바꿈 문자, Line Feed, \u000A
\s 공백 문자, White-Space Character, \t \r \n 스페이스 포함
\S \s 이외의 문자
\d 숫자, [0-9] 과 같은 의미
\D \d 이외의 문자, [^0-9] 과 같은 의미
\w Word Character, [a-zA-Z0-9_] 과 한글 일본어 중국어 등의 유니코드 문자 포함
\W \w 이외의 문자
\b [ ] 안에서 사용될 때는 백스페이스 문자, Backspace, \u0008
[ ] 밖에서 사용될 때는 \w 과 \W 사이의 경계, Word Boundary
치 환 Pattern에서 사용될 때는 항상 백스페이스 문자
\\ \ 문자 자체를 가리킬 때 사용
비슷한 사용법 \. \* \+ \? \^ \$ \( \) \{ \} \[ \]
\u0020 16진수 Unicode 문자, 항상 4자리로 사용
\x20 16진수 ASCII 문자, 항상 2자리로 사용