컴퓨팅/프로그래밍

정규표현식

에어버스 2010. 6. 13. 22:39

테스트프로그램 : http://forta.com/books/0672325667/RegExTester_JavaScript.zip


1.문자 하나 찾기 : .
. : 한문자 아무거나, ..: 두문자 아무거나, 연속해서 사용 가능하다.
예문:
sales.xls
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls

검색어 : sales.
결과:
sales.
sales1
sales2
sales3

\. : 마침표, \\: \를 찾음

2. 집합문자 : []
[ns] : n 혹은 s 가 들어간 문자를 찾음
예문:
The pharse "regular expression" is often abbreviated as RegEx or regex.
검색어 : [Rr]eg[Ee]x
결과 :
RegEx
regex

[0123456789] = [0-9], [A-Z], [a-f]
[A-Za-z0-0] : 모든영숫자와 일치

예문:
<BODY BGCOLOR="#336633" TEXT="#FFFFFF" MARGINEWIDTH="0" MARGINEHEIGHT="0" TOPMARGINE="0" LEFTMARGINE="0">
검색어 : #[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]
결과 :
#336633
#FFFFFF

^ : 제외

예문 ; sales.xls
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
sam.xls
ca1.xls

검색어 : [ns]a[^0-9].xls
결과 :
sam.xls

예문:
var myArray = new Array();
if(myArray[0] == 0)
{
}
검색어 : myArray\[[0-9]\]
결과 : myArray[0]

예문 :
\home\ben\sales\
검색어 : \\
결과 :
\
\
\
\

[/b] 역스페이스
\f 페이지 넘김(Form feed)
\n 줄바꿈
\r 캐리지 리턴
\t 탭
\v 수직 탭


\d : 숫자 하나, [0-9] 와 같음
\D : 숫자 제외, [^0-9] 와 같음


예문:
var myArray = new Array();
if(myArray[0] == 0)
{
}
검색어 : myArray\[\d\]
결과 : myArray[0]

\w : 대소문자와 밑줄을 포함하는 모든 영숫자, [a-zA-Z0-9_] 와 같음
\W : 영숫자나 밑줄이 아닌 모든 문자, [^a-zA-Z0-9_] 와 같음

예문:
11213
A1C2E3
48075
48237
M1B4F2
90046
H1H2H2

검색어 : \w\d\w\d\w\d
결과:
A1C2E3
M1B4F2
H1H2H2

\s : 모든 공백문자, [\f\n\r\t\v] 와 같음
\S : 공백문자가 아닌 모든 문자, [^\f\n\r\t\v] 와 같음
\x : 16진수 값, \x0A (ASCII 10, 줄바꿈 문자, \n)
\0 : 8진수 값, \011 (ASCII 8로 \t)
\c : 컨트롤 문자, \cZ (Ctrl+Z)

포직스 문자 클래스 - 자바스크립트는 미지원
[: 로 시작, :] 로 끝난다.
[:alnum:] 모든 영숫자, [a-zA-Z0-9] 와 같다
[:alpha:] 모든 영문자, [a-zA-Z]
[:blank:] 빈칸(Space)이나 탭문자, [\t ]
[:cntrl:] ASCII 제어문자 (ASCII 0~31, 127번)
[:digit:] 모든 한자리 숫자, [0-9]
[:graph:] [:print:] 와 동일하나 빈칸(Space)은 제외
[:lower:] 모든 소문자, [a-z]
[:print:] 출력 가능한 모든 문자
[:punct:] [:alnum:] 이나 [:cntrl:] 가 포함되지 않은 모든 문자
[:space:] 빈칸을 포함한 모든 공백문자, [\f\n\r\t\v]
[:upper:] 모든 대문자, [A-Z]
[:xdigit:] 모든 16진수 숫자, [a-fA-F0-9]


+ : 문자 하나 이상

예문:
Send personal email to ben@forta.com. For question about a book use support@fora.com.
Fell free to send unsolicited email to spam@forta.com (wouldn't it be nice if ii were that simple, huh?).

검색어 : \w+@\w+\.\w+
결과:
ben@forta.com
support@fora.com
spam@forta.com

계정이나 도메인에 . 이 포함되는 경우

예문:
Send personal email to ben@forta.com or ben.forta@forta.com. For question about a book use support@fora.com.
If your message is urgent try ben@urgent.forta.com. Feel free to send unsolicited email to spam@forta.com (wouldn't it be nice if ii were that simple, huh?).

검색어 : \w+@\w+\.\w+
결과:
ben@forta.com
forta@forta.com
support@fora.com
ben@urgent.forta
spam@forta.com

와 같이 .이 계정이나 도메인에 있는 경우는 찾지 못하는 문제가 있다. 그래서 아래와 같이 검색어를 수정해야만 한다.

검색어 : [\w.]+@[\w.]+\.\w+
결과:
ben@forta.com
ben.forta@forta.com
support@fora.com
ben@urgent.forta.com
spam@forta.com

(집합 안에 . 앞에 \를 생략해도 이스케이프 문자로 취급한다. 물론, . 대신 \. 로 고쳐써도 된다.)

* : 앞에 오는 문자가 없거나 '하나이상'

예문: (오타로 메일주소 앞에 . 찍음)
Hello, .ben@forta.com is my email address.

검색어 [\w.]+@[\w.]+\.\w+
결과 : .ben@forta.com (. 이 맨 앞에 오면 안되므로 아래 검색어 참조)

검색어 : \w+[\w.]*@[\w.]+\.\w+
결과 : ben@forta.com (오타는 무시하고 원하는 메일 주소만 찾는다)

? : 앞에 오는 문자 혹은 집합이 없거나 '하나'인 문자

예문:
The URL is http://www.forta.com/, to connect
securely use https://www.forta.com/ instead.

검색어 : http://[\w./]+
결과 : http://www.forta.com/

검색어 : https?://[\w./]+   
결과:
http://www.forta.com/
https://www.forta.com/

예문:
"101","Ben","Forta"
"102","Jim","James"

"103","Roberta","Robertson"
"104","Bob","Bobson"

검색어 : \r\n\r\n
결과 : 없음 (빈줄을 못 찾음)

검색어 : [\r]?\n[\r]?\n   (집합기호 안에 메타문자가 1개 오므로 집합문자는 생략 가능하나 적용범위 혼란을 방지하기 위해 일부 개발자는 이런 경우에도 집합기호를 사용한다)
결과 : 빈줄을 찾음


{} : 일치해야 하는 횟수 지정
{3} 바로 앞에 오는 문자나 문자집합이 3번 연속해서 일치

예문:
<BODY BGCOLOR="#336633" TEXT="#FFFFFF" MARGINEWIDTH="0" MARGINEHEIGHT="0" TOPMARGINE="0" LEFTMARGINE="0">

검색어 : #[0-9A-Fa-f]{6} (#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f] 보단 단순)
결과:
#336633
#FFFFFF

예문:
4/8/03
10-6-2004
2/2/2
01-01-01

검색어 : \d{1,2}[-\/]\d{1,2}[-\/]\d{2,4}
결과:
4/8/03
10-6-2004
01-01-01

이 검색어에서는 날짜가 맞는지 확인못함, 예로 54/67/9999 도 찾게 된다.

최소구간 찾기
최대구간 없이 최소값만 지정한다. (예, {3,} 최소 3번 일치 = 3번이상 일치)
예문:
1001: $496.80
1002: $1290.69
1003: $26.43
1004: $613.42
1005: $7.61
1006: $414.90
1006: $25.00

검색어 : \d+: \$\d{3,}\.\d{2}
결과:
1001: $496.80
1002: $1290.69
1004: $613.42
1006: $414.90


예문:
This offer is not available to customers
living in <B>AK</B> and <B>HI</B>

검색어 : <[Bb]>.*</[Bb]>
결과:
AK and HI

검색어 : <[Bb]>.*?</[Bb]>
결과:
AK
HI

(? 가 있으므로 구간을 최소화 한다) 그런데, <B>와 </B>는 왜 안 나오지?


\b : 단어의 시작이나 끝, 영숫자, 밑줄, \w와 일치하는 문자와 그외의 문자사이에 있는 위치와 일치한다.


예문:
The cat scattered his food all over the room.

검색어 : cat
결과:
cat
scattered

검색어 : /bcat/b
결과 : cat

예문:
The captain wore this cap ans cape proudly as
he sat listening to the recap of how his
crew saved the men from a capsized vessel.

검색어 : \bcap
결과:
cap
cap
cap
cap

검색어 : cap\b    (cap 으로 끝나는 단어)
결과:
cap
cap

예문:
Please enter the nine-digit id as it appears on your color - coded pass-key.

검색어 : \B-\B   (\B 는 특별히 단어 경계와 일치시키고 싶지 않을때 사용, \B\B 단어구분 문자로 둘러싸인 - 과 일치한다)
결과 : -         (\B 메타문자를 활용해 잘못 쓰인 빈칸으로 둘러사인 -을 찾는다)


예문:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:difinitions= targetNamespace="http://tips.cf"
xmlns:impl="http://tips.cf" xmlns:intf="http://tips.cf"
xmlns:apachesoap="http://xml.apache.org/xml-soap"

검색어 : <\?xml.*\?>
결과 :