시소당
(*맛보기 예제)
표현 기능
egrep '( *)?\$[qQ]uery=?' ./index.bin.php
$query,
$Query,
$query =,
$Query= 등을 찾아준다.
egrep '^[ \t]*$' ./index.bin.php 빈줄을 찾아준다.
egrep -i '\<(\w+) +\1\>' ./index.bin.php 같은 문자의 반복을 찾아준다.
* 정규표현식의 기원
o 1940년대 뉴런단계에서 신경계가 작동하는 모델애대한 가설을 제안한 워렌 맥쿨로흐와 윌터피츠(신경생리학자) 몇년후 스티븐클린(수학자)이 이 모델을 대수적인 방식으로 기술하면서 정규표현식이 모양을 갖추게 되었다. 이러한 정규집합을 표현할수 있는 간단한 표기법을 고안하고 정규표현식이라 불렀다.
o 정규표현식이 전산분야에서 응용한 첫번째 업적은 1968년 켄톰슨이 "정규 표현식 검색 알고리즘" 논문에서 IBM 7094객체코드를 만들어내는 정규 표현식 컴파일러가 있다.
* 강력하고 융통성 있고 효울적인 텍스트 처리의 열쇠
* 정규표현식을 제공하는 언어(Perl,Java,VB.NET등..)에서 텍스트 처리를 위한 도구를 제공하고 있지만 무엇보다도 정규표현식을 알아야 원하는 텍스트와 원치않는 텍스트를 구분하여 정확하게 얻을수있다.
* 정규식을 통해 수행가능 한것.
o 문자열에 있는 패턴을 테스트합니다. 예를 들어, 입력 문자열을 테스트하여 전화 번호 패턴 또는 신용 카드 번호 패턴이 문자열에 있는지 볼 수 있습니다. 이를 데이터 유효성이라고 합니다.
o 텍스트를 바꿉니다. 정규식을 사용하여 문서에서 특정 텍스트를 식별하고 이를 완전히 제거하거나 다른 텍스트로 바꿀 수 있습니다.패턴 일치를 기반으로 문자열에서 부분 검색 문자열을 추출합니다. 문서 또는 입력 필드에서 특정 텍스트를 찾을 수 있습니다. 예를 들어, 전체 웹 사이트를 검색하여 오래된 자료를 제거하고 일부 HTML 서식 태그를 바꿔야 할 경우 정규식을 사용하면 찾는 자료 또는 HTML 서식 태그가 특정 파일에 있는지 여부를 테스트할 수 있습니다. 이 방법을 사용하면 영향을 받는 파일의 범위를 제거되었거나 변경된 내용이 있는 파일로 좁힐 수 있습니다. 그런 다음 정규식을 사용하여 오래된 자료를 제거하고 대체할 태그를 찾아서 바꿀 수 있습니다.(vi : s/찾을말/바꿀말/G)
o 문자열 처리 기능이 지원되지 않는 언어에서도 정규식을 유용하게 사용할 수 있습니다. Visual Basic에 포함된 VBScript에는 다양한 문자열 처리 기능이 있는 반면 JScript에는 C와 마찬가지로 이러한 기능이 없습니다. 정규식은 JScript의 문자열 처리 기능을 상당히 향상시켰을 뿐만 아니라, 단일 식에서 여러 문자열을 처리할 수 있으므로 VBScript에서도 효율적으로 사용할 수 있습니다.
정규표현식의 사용
* 메타문자 요약
메타문자 이름 매치대상
. 점 임의의 한개의 문자
ex) abcd.fghi * 썬의 자바 정규 표현식 패키지와 같이 유니코드를 쓸수 있는 시스템에서는 일반적으로 점이 유니코드
행 종료 문자에 매치되니 않는다. (.....fds\[nl\]) -> ps. \Z,\z 로 가능(뒤에 설명)
메타문자 이름 매치대상
[] 문자클래스 목록에 있는 문자 중 하나
[^ ] 부정형 문자클래스 목록에 없는 문자 중 하나
[xyz] 문자 집합입니다. 괄호 안의 문자 중 하나를 찾습니다. 예를 들어, "gr[ea]y" 는 "gray","grey" 에 매칭 [^xyz] 제외
문자 집합입니다. 괄호 밖의 문자 중 하나를 찾습니다. 예를 들어, "q[^u]"는 "Iraqi"등에 매칭 [a-z] 문자 범위입니다.
지정한 범위 안의 문자를 찾습니다. 예를 들어, "[a-z]"는 "a"부터 "z" 사이의 모든 소문자를 찾습니다. [^a-z] 제외
문자 범위입니다. 지정된 범위 밖의 문자를 찾습니다. 예를 들어, "[^a-z]"는 "a"부터 "z" 사이에 없는 모든 문자를 찾습니다.
*주의 : [^x] x가 없으면 매칭된다 (X) x가 아닌것에 매치된다.(0)
메타문자 이름 매치대상
^ 캐럿 행이 시작하는 위치
^bob bob문자가 행에 처음 위치하는 경우만 매치 ^ 모든행에는 행시작이 있기때문에 완전비어있는행포함 모든 행이 매치된다.
캐럿(^)은 검색하는 텍스트의 시작 위치에 매치됨 (cf. /A 일반적으로 캐럿과 같은 동작)
메타문자 이름 매치대상
$ 달러 행이 끝나는 위치
^cat$ cat만 적혀있는행 (다른단어,스페이스,문장부호등이 전혀 없는 형태) ^$ 전혀 아무것도 없이 비어있는행 행의
마지막 문자가 줄바꿈 문자인경우에는 그 앞에서 매치된다. \Z 모드지정안한경우 $과 같음 \z 줄바꿈 문자와 상관없이
항상 문자열의 끝에만 매치된다.
메타문자 이름 매치대상
\< 백슬래쉬< 단어가 시작하는 위치
\> 백슬래쉬> 단어가 끝나는 위치
that dang - tootin' #$%^& varmint's cost
$133.95! /that/ /dang/ - /tootin/' #$%^& /varmint/'/s/ /cost/ $/133/./95/!
단어의 시작과 끝 -> 숫자또는 글자로 구성된 시퀀스의 시작과 끝 \<와 \> 는 일부 버전의 egrep 에서는 지원안됨
메타문자 이름 매치대상
| 또는, 수직막대(bar) 수직막대로 구분된 각 표현식 중 하나에 매치됨
x|y x x또는 y를 찾습니다. 예를 들어, "z|food"는 "z" 또는 "food"를 찾습니다. "(z|f)ood"는 "zood" 또 는 "food"를 찾습니다.
메타문자 이름 매치대상
( ) 괄호 (|)의 영역(선택의 범위)을 제한함, 수량자가 적용되는 그룹을 지정, 백레퍼런스를 쓸때 위치를 지정하기위한 메타문자
"(z|f)ood"는 "zood" 또는 "food"를 찾습니다. lo*ve (lo)*ve \$[0-9]+(\.[0-9][0-9])? //달러표시
<HR( +SIZE *= *[0-9]+)? *> \<([-a-z0-9_.:@&?=+]+) +\1\> //중복검사
메타문자 이름 매치대상
\char 이스케이프 처리된 문자 char이 메타 문자이거나 이스케이프 처리된 내용에 별도의 특별한 의미가 없으면 char 문자에 매치됨
메타문자 이름 매치대상
\1,\2... 백레퍼런스 앞에서 첫번ㅤㅉㅒㅤ, 두번째, ...등의 괄호 안에서 매치된 텍스트에 매치됨
^([-+]?[0-9] +(\.[0-9]*)?)([CF])$ +36.5C 42 F .....
$1(첫번째괄호)
$2(두번째괄호)
$3(세번째 괄호) 백레퍼런스 는
일부 버전의 egrep 에서는 지원안됨
캡쳐기능 사용안하기 : (?:......)
* 수량자 요약
최소갯수 최대갯수 의미
? 0 1 없어도 되고 최대 하나까지 가능함
* 0 무제한 없어도 되고 무한정 가능함(원하는 만큼 쓸수 있음)
+ 1 무제한 적어도 하나 있어야 하고 무한정 가능함(최소한 하나)
{min,max} min max 주어진 범위
{n} n은 음이 아닌 정수입니다. 정확히 n개 찾습니다. 예를 들어, 'o{2}'는 "Bob"의 "o"는 찾지 않지만
"food"의 o 두개는 찾습니다. {n,} n은 음이 아닌 정수입니다. 정확히 n개 이상을 찾습니다.
예를 들어, 'o{2,}'는 "Bob"의 "o"는 찾지 않지만 "foooood"의 모든 o는 찾습니다. 'o{1,}'는 "o+"와 같고,
'o{0,}'는 "o*"와 같습니다. {n,m} m과 n은 음이 아닌 정수입니다. 여기서 m은 n보다 크거나 같습니다.
최소 n개, 최대 m개 찾습니다. 예를 들어, "o{1,3}"은 "fooooood"의 처음 세 개의 o를 찾습니다.
"o{0,1}"은 "o?"와 같습니다. 쉼표와 숫자 사이에는 공백을 넣을 수 없습니다.
* 정규표현식에서 제공하는 약자
의미
\t 탭문자
\n 줄바꿈문자
\r 캐리지 리턴문자
\s 모든 "공백"문자(스페이스,탭,줄바꿈문자,폼피드 등)에 매칭되는 문자
\S \s를 제외한 모든문자
\w [a-zA-Z0-9_](단어에 매치시킬때 (\w+)를 많이 쓴다)-밑줄포함
\W \w가 아닌 모든문자 즉 ([^a-zA-Z0-9_])
\d [\0-9] 즉 숫자
\D \d를 제외한 모든문자 즉 [^0-9]
\b 단어의 경계, 즉 단어와 공백 사이의 위치를 찾습니다. 예를 들어, "er\b"는 "never"의 "er"는 찾지만 "verb"의 "er"는 찾지 않습니다.
\B 단어의 비경계를 찾습니다. "er\B"는 "verb"의 "er"는 찾지만 "never"의 "er"는 찾지 않습니다
* 룩어라운드의 네가지 유형
유형 정규표현식 매치조건
긍정형 룩 비하인드 (?<=....) 하위표현식이 왼쪽에서 매치될때
부정형 룩 비하인드 (?<!....) 하위표현식이 왼쪽에서 매치되지 않을때
긍정형 룩 어헤드 (?=....) 하위표현식이 오른쪽에서 매치될때
부정형 룩 어헤드 (?!....) 하위표현식이 오른쪽에서 매치되지 않을때
룩어라운든는 단어의 경계를 나타내는 메타문자인 /b,^.$와 마찬가지로 텍스트에 매치되지 않고 텍스트 안의 어떤 위치에
매치된다. "by Jeffrey Friedl" (?=Jeffrey)Jeff //순서가 매우 중요 Jeff(?=Jeffery) -> Jeff 바로 뒤에 Jeffery 가 있는 경우
"see jeffs book" jeffs -> jeff's \bJeff(?=s\b) 로 찾을 수 있음
(치환) s/\bJeffs/Jeff's/g s/\b(Jeff)(s)\b/
$1'
$2/g s/(?<=\bJeff)(?=s\b)/'/g
* 주석 및 모드 변경자
o 모드 변경자 (?변경자 ) ex.(?i),(?-i)
(?i)very(?-i) -> 대소문자 구별없이 매치시킨다.
글자 모드
i 대소문자를 무시하고 매치하는 모드
x 공백과 주석을 마음대로 쓸수 있는 정규식 표현 모드
s 점으로 모든 문자를 매치시킬수 있는 매치모드
m 향상된 행 앵커매치모드
*
o 특정범위에 모드 적용 (?변경자: )
(?i)very(?-i) -> (?i:very)
*
o 주석 (?#....),#.....
공백 및 주석을 자유롭게 쓰는 모드가 있기 때문에 많이 쓰이지는 않는다.
*
o 특정 범위의 텍스트를 그대로 출력 : \Q ....\E
\Q ....\E 라는특별한 시퀀스는 펄에서 처음 도입되었으면 그사이에 \E를 제외한 다른 모든 정규표현식메타문자를 무시한다.
\Q.....\E를 완벽하게 지원하는 정규표현식 엔진은 썬의 java.util.regex
$query = "C:\WINDOWS\"; \Q
$query\E
실제 예제
* IP주소
0~255
^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$ ^d{1,3}\.d{1,3}\.d{1,3}\.d{1,3}$
각 숫자부분을 괄호로 감싸서 백레퍼런스(
$1,
$2,
$3,
$4)를 이용하여 숫자를 확인하는 방법
* 앞뒤 공백제거
s/^\s+|\s+$//g
* HTTP url 검사
^http://([^/]+(:(\d+))?)(\.*)?$ //벡레퍼런스로 변수를 확인
* 호스트 이름확인
제약사항: 63글자
(?i:) //대소문자 구별 안함 (?: [a-z0-9]\.|[a-z0-9][-a-z0-9]{0,61}[a-z0-9]\.)* (?: com|edu|gov|int|mil|net|org|info|name|museum|coop|aero|[a-z][a-z])$
한글과 정규표현식
유니코드와 정규표현식
유니코드 - 문자와 코드사이의 대응관계
유니코드표준에는 더많은 내용이 들어있다
이문자는 소문자이다. 이문자는 오른쪽에서 왼쪽으로 써야한다. 이문자는 다른 문자와 함께 쓰기 위해 만들어진 기호이다. ...같은 성질이 정의 되어있다.
정규표현식중에서 유니코드를 쓸수 있는 프로그램 중에는 \p{성질} -그성질을 가지는 문자에 매치됨 또는 \P{성질} -그성질을 가지지 않는 문자에 매치됨
클래스 동의어 및 설명
\p{L} \p{Letter} 글자로 간주되는 문자
\p{M} \p{Mark}엑센트 기호,문자테두리
\p{N} \p{Number}숫자
\p{z} \p{Seperator}공백문자
\p{p} \p{Punctuation}문장 부호
\p{c} \p{Other}위의속성에 해당하니 않는 나머지 문자
[출처] 정규표현식|작성자 효돌
http://blog.naver.com/blueroll80?Redirect=Log&logNo=35933187