우선 사용예는 다음과 같다.
예) <script language="javascript"> function chk(pstr) { var chkRep = /....-..-../; alert(chkRep.test(pstr)); } </script>
정규식은 다음과 같다.
(1) ^ (caret) : 라인의 처음이나 문자열의 처음을 표시 예 : ^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓)
(2) $ (dollar) : 라인의 끝이나 문자열의 끝을 표시 예 : aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓)
(3) . (period) : 임의의 한 문자를 표시 예 : ^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓) a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참)
(4) [] (bracket) : 문자의 집합이나 범위를 나타냄, 두 문자 사이의 "-"는 범위를 나타냄 []내에서 "^"이 선행되면 not을 나타냄 이외에도 "문자클래스"를 포함하는 [:문자클래스:]의 형태가 있다. 여기에서 "문자클래스"에는 alpha, blank, cntrl, digit, graph, lower, print, space, uppper, xdigit가 있다. 이에 대한 자세한 내용은 C언어의 <ctype.h>를 참조하면 된다. 예를 들어 [:digit:]는 [0-9]와 [:alpha:]는 [A-Za-z]와 동일하다. 이외에 [:<:]와 [:>:]는 어떤 단어(숫자, 알파벳, '_'로 구성됨)의 시작과 끝을 나타낸다. 예 : [abc] (a, b, c 중 어떤 문자, "[a-c]."과 동일) [Yy] (Y 또는 y) [A-Za-z0-9] (모든 알파벳과 숫자) [-A-Z]. ("-"(hyphen)과 모든 대문자) [^a-z] (소문자 이외의 문자) [^0-9] (숫자 이외의 문자) [[:digit:]] ([0-9]와 동일)
(5) {} (brace) : {} 내의 숫자는 직전의 선행문자가 나타나는 횟수 또는 범위를 나타냄 예 : a{3} ('a'의 3번 반복인 aaa만 해당됨) a{3,} ('a'가 3번 이상 반복인 aaa, aaaa, aaaa, ... 등을 나타냄) a{3,5} (aaa, aaaa, aaaaa 만 해당됨) ab{2,3} (abb와 abbb 만 해당됨) [0-9]{2} (두 자리 숫자) doc[7-9]{2} (doc77, doc87, doc97 등이 해당) [^Zz]{5} (Z와 z를 포함하지 않는 5개의 문자열, abcde, ttttt 등이 해당) .{3,4}er ('er'앞에 세 개 또는 네 개의 문자를 포함하는 문자열이므로 Peter, mother 등이 해당)
(6) * (asterisk) : "*" 직전의 선행문자가 0번 또는 여러번 나타나는 문자열 예 : ab*c ('b'를 0번 또는 여러번 포함하므로 ac, ackdddd, abc, abbc, abbbbbbbc 등) * (선행문자가 없는 경우이므로 임의의 문자열 및 공백 문자열도 해당됨) .* (선행문자가 "."이므로 하나 이상의 문자를 포함하는 문자열, 공백 문자열은 안됨) ab* ('b'를 0번 또는 여러번 포함하므로 a, accc, abb, abbbbbbb 등) a* ('a'를 0번 또는 여러번 포함하므로 k, kdd, sdfrrt, a, aaaa, abb, 공백문자열 등) doc[7-9]* (doc7, doc777, doc778989, doc 등이 해당) [A-Z].* (대문자로만 이루어진 문자열) like.* (직전의 선행문자가 '.'이므로 like에 0 또는 하나 이상의 문자가 추가된 문자열이됨, like, likely, liker, likelihood 등)
(7) + (asterisk) : "+" 직전의 선행문자가 1번 이상 나타나는 문자열 예 : ab+c ('b'를 1번 또는 여러번 포함하므로 abc, abckdddd, abbc, abbbbbbbc 등, ac는 안됨) ab+ ('b'를 1번 또는 여러번 포함하므로 ab, abccc, abb, abbbbbbb 등) like.+ (직전의 선행문자가 '.'이므로 like에 하나 이상의 문자가 추가된 문자열이 됨, likely, liker, likelihood 등, 그러나 like는 해당안됨) [A-Z]+ (대문자로만 이루어진 문자열)
(8) ? (asterisk) : "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열 예 : ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨)
(9) () (parenthesis) : ()는 정규식내에서 패턴을 그룹화 할 때 사용
(10) | (bar) : or를 나타냄 예 : a|b|c (a, b, c 중 하나, 즉 [a-c]와 동일함) yes|Yes (yes나 Yes 중 하나, [yY]es와 동일함) korea|japan|chinese (korea, japan, chinese 중 하나)
(11) (backslash) : 위에서 사용된 특수 문자들을 정규식내에서 문자를 취급하고 싶을 때 ''를 선행시켜서 사용하면됨 예 : filename.ext ("filename.ext"를 나타냄) [?[\]] ('?', '[', '', ']' 중 하나)
정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함 ##################################################################################### 1.개념잡기
일반화시킨표현.이것을정규표현이라고요약할수있을것같다. 다음의과정을너무쉽다생각말고따라오길바란다.
-감잡기
"12354"->숫자 "asdfasf"->알파벳 두가지의간단정규표현을만들었다.실생활의보기와비추어보자. "길이가3인이름!" 위의표현은길이를표시하는방법이없다.조금더발전시켜서"알파벳{3}"이런식 으로길이를표현할수있도록한다.그리고,"알파벳"란것도너무길다"알" 이라고한글자로표현한다.그러면"길이가3인이름"은 "알{3}"으로표시가가능하다. 길이가10인숫자는"수{10}" "길이가1인알파벳이나오고그다음에길이가3인숫자가나오는문자열"!-> "알{1}수{3}"얼핏이나마감이올것이다. "첫글자는A,그다음은아무알파벳5글자"->"A알{5}"
-조금더
아이디는대개첫글자는영문이고두번째부터는영문이나숫자가온다.이것을 표현하기위해선이것들중에하나란의미를갖는새로운표현이필요하다. "a,b,c,d중에하나"->[abcd] 응용하면, "알파벳이나,숫자중하나"->[알수] "["안에있는문자들의순서는의미가없으며,그표현은(클래스라고한다.) 결국한글자를말한다. 위에서말한"첫글자는영문,두번째부터는영문이나숫자가11자"를 표현하면,"알[알수]{11}". 그런데,실제로모든아이디가12자인것은아니다,대개4자부터12자를지원한다. 새로운표현이등장한다."몇자부터몇자" "A가3글자부터12자"->"A{3,12}" "알파벳이나숫자가1자부터100자"->"[알수]{1,100}" 이제아이디를다시정의하자. "첫글자는영문,영문이나숫자가3자부터11자"->"알[알수]{3,11}"
2.표현식
지금까지의규칙에서설명한용어를실제정규표현에서사용하는표현으로바꾸고, 다른세부적인옵션에대해알아보자.
:다음의글자가특별한문자임을나타낸다.때론,그다음문자자체를의미하기 도한다. 보기를들면,"n"은문자""과문자"n"두글자와매치되는것을의미하는것이아 닌, 새줄(NewLine)을의미하며,""은첫""다음문자인""자체를의미한다. 즉,""은 ""과매칭된다.
^:입력문자열의맨처음을의미한다.(맨첫글자가아니라,맨처음이란문맥적의 미를 말한다.아주중요하다)기본적으로정규표현은입력문자열의한줄에만적용된다. 하지만,옵션에따라여러줄에적용할수도있다.그럴경우에는"^"는"n" 나"r" 다음의위치를의미한다.
$:"^"는반대로입력문자열의맨끝을의미한다.역시여러줄에정규표현이적용 될 경우에는"n"이나"r"의앞의위치를의미한다.
*:이문자앞의표현이0번내지무한번반복될수있음을말한다. 보기를들면,/a*/은"a","","aaaa","aaaaa"와매칭된다. (0번이상은없어도된다는것을의미한다.)
+:*와같지만,0번이상이아니라1번이상이라는점을제외하곤/*/와같다.
?:앞의표현이0번또는1번./do(es)?/는"do","does"와매칭된다.
{n}:앞의표현이n은음수가아닌정수이어야하며,앞의표현이 n번매치되는것을말한다.
{n,}:앞의표현이n은음수가아닌정수이어야하며,n번이상 매치되는것을말한다.
{n,m}:앞의표현이n번이상부터m번이하까지매칭되는것을 말하며,/*/는/{0,}/과같으며,/+/는/{1,}/과/?/는/{0,1}/으로 표현가능하다.
.:"n"을제외한한글자를뜻한다.만일모든글자를표현하고 싶다면("n"마저도합친)/[.n]/을사용하면된다.
x|y:x또는y와매칭된다.보기를들면,/z|food/는"z"또는 "food"와매칭된다./(z|f)ood/는"zood"또는"food"와매칭된다. (참고로괄호는묶어준것이상의의미가있다.)
(패턴):해당패턴과매칭시키고,그부분을특정변수에담는다. 그변수이름은JScript는$0~$9까지의변수에저장이되고(Perl과같다.), VBScript에서는SubMatches컬렉션에저장된다. 괄호기호자체와매치시키고싶다면?/(/와/)/를사용한다.
(?:패턴):해당패턴과매칭은시키지만,그부분을특정변수에 담지않는다.왜이게필요할까? 위의보기에서/(z|f)ood/는"zood"또는"food"와매칭된다고했는데, 단순히매칭의목적으로사용했지만,"zood"의경우"z"가$0이란 변수에저장이되고말았다.이러한것을막기위해서사용하는것이 (?:패턴)이다.
(?=패턴):(?:패턴)과동일하지만,패턴과일치한부분이후부터 다음매치가일어나지않고패턴앞부터다시매칭이진행된다. 즉,룩업(lookup,lookahead)을할뿐이다./Windows(?=95|98|NT|2000)/은 "Windows2000"의"Windows"부분과매칭이되며다음매칭은 "2000"다음부터가아닌"Windows"다음부터진행이된다.
(?!패턴):(?=패턴)과반대다./Windows(?=95|98|NT|2000)/은 "Windows3.1"의"Windows"부분과매칭이된다.
[xyz]:"["안에있는표현중하나를의미한다.
[^xyz]:"["안에있는표현을제외한것중하나를의미한다. "[^abc]"는"plain"의"p"때문에매칭된다.
[a-z]:"a"부터"z"까지의문자중하나
[^a-z]:"a"부터"z"까지의문자를제외한하나
b:단어의경계(단어와공백,"n","r"의사이)와매칭된다. 보기를들면,"erb"는"never"와는매칭되지만,"verb"와는매칭되지않는다.
B:단어의경계가아닌것과매칭된다."erB"는"verb"와는 매칭되지만,"never"와는매칭되지않는다.
cx:Ctrl+x키와매칭된다."cc"는Ctrl+C와매칭된다.x의범위는 [a-zA-Z]이며,만일이이외의문자를사용한다면"c"는"c"와동일하다.
d:[0-9]와같다.
D:[^0-9]와같다.참고로대문자는소문자의반대의미를갖는다.
f:폼피드(form-feed)문자를의미하며,"x0c"와"cL"과동일하다.
n:새줄(newline)를의미하며,"x0a"와"cJ"와동일하다.
r:캐리지리턴(carriagereturn)을의미하며,"x0d"와"cM"과동일하다.
t:탭."x09","cI"과동일
v:버티컬탭."x0b","cK"과동일
s:화이트스페이스를의미한다.화이트스페이스란공백,탭,폼피드, 캐리지리턴등을의미한다.[fnrtv]과동일("f"앞에공백이있다.주의!)
S:"[^fnrtv]"
w:"_"를포함한일반적인단어에사용되는문자를말한다. "[A-Za-z0-9_]"과동일
W:"[^A-Za-z0-9_]"
xn:n은2자리16진수이며,해당16진수코드와매칭된다."x412"는16진수 41은"A"이기때문에"A2"와매칭된다.
num:캡쳐한매칭을가리킨다(백레퍼런스,backreference). "(.)1"은연속된두개의문자열을의미한다. n:"1"은위에서캡쳐한매칭(backreference)를가리킨다고했는데, 만일이패턴앞에어떠한n개의캡쳐한표현이있다면백레퍼런스이지만, 그렇지않은경우에는8진수로간주하여해당코드의문자와매칭된다.
un:n은4자리UNICODE이다."u00A9"은copyright심볼인"ⓒ"와매칭된다.
greedy,non-greedy
?:앞에서설명했는데,왜또?라고생각할것이다. ?은문맥에따라특별한의미를갖는다. 패턴"o*"는"foooood"와매칭된다.당연하다!하지만,"f"앞의"o"와 매칭되는것이아니다!!"ooooo"와매칭된것이다.즉,기본으로 정규표현매칭은가장큰범위를선택한다.이것을greedy하다고한다. 하지만,때론작은범위에매칭시킬필요가있을경우가있다. (이의적절한보기는잠시후에나온다.)"o*?"가방금말한 non-greedy매칭이다. 수량관련문자인"*","+","?","{n}","{n,}","{n,m}"다음에"?"가 나오면non-greedy매칭이된다. 잠시,위에서"o*?"가"o"와매칭된다고했는데이상하게생각한분이 있었을것이다.맞다."o*?"는""와매칭되었다."*"는0개이상임을 잊어선안된다."o+?"가"o"와매칭된다.
4.보기
-웹주소
"http://msdn.microsoft.com:80/scripting/default.htm" 위의주소를표현할수있는정규표현은아래와같다. /(w+)://([^/:]+)(:d*)?([^#]*)/ $1:http $2:msdn.microsoft.com $3:80 $4:/scripting/default.htm
-중복된단어를하나로
중복된영어단어를하나로합치기위해선,우선단어를찾아야한다. 그리고단어는앞뒤가단어의경계이어야한다.(말이참이상하지만..) 따라서,아래와같은1차정규표현을얻을수있다.
/b([a-z]+)b/
연속해서동일한두개의단어...앞에서캡쳐한표현을다시활용하면된다. 그리고,단어와단어사이엔화이트스페이스가있다.
/b([a-z]+)s+1b/
-HTML태그제거
HTML문서에서태그를제거한문서를추출하고자한다. 태그는"<"와">"로감싸여있다.
/<.*>.*</.*>/
그런데,위의정규표현을HTML문서에적용하여해당패턴을"", 빈문자열로바꾸면문서는빈문서가되고만다.
<html> <title>...</title> <body> <font>....</font> ... </body> greedy한매칭이기본값이라고위에서언급을했다.따라서, 위의HTML문서를보면,<html>....</body>로생각할수있다. 따라서,문서전체가사라지는것이다.이것을막기위해선"*"뒤에"?"를 추가하면된다.
/<.*?>.*?</.*?>/
아직끝나지않았다.:)
좀더정제를한다면,올바른HTML문서는<태그명>과</태그명>이 서로일치한다.이것도적용한다면,
/<.(*?)>.(*?)</1>/
위의$1에해당되는부분을좀더생각해보면,">"를제외한문자로 볼수있다.따라서최종적으로아래와같이정리된다.
/<(w+)[^>]*?>(.*?)</1>/
-URL
/(?:^|")(http|ftp|mailto):(?://)?(w+(?:[.:@]w+)*?)(?:/|@)([^"?]*?)(?:? ([^?"]*?))?(?:$|")/
-float상수
/^(((+|-)?d+(.d*)?)|((+|-)?(d*.)?d+))$/-1.11.1.9.8
정규식 구문 정규식은 일반 문자(예: a에서 z)와 메타문자 로 알려진 특수 문자로 구성된 텍스트 패턴입니다. 패턴은 텍스트 본문을 검색할 때 일치하는 문자열을 하나 이상 설명합니다. 정규식은 검색되는 문자열과 일치하는 문자 패턴을 찾는 템플릿의 역할을 합니다. 일반적으로 볼 수 있는 몇 가지 정규식 예는 다음과 같습니다. JScript VBScript 검색 /^[ t]*$/ | "^[ t]*$" | 빈 줄을 찾습니다. | /d{2}-d{5}/ | "d{2}-d{5}" | 2자리, 하이픈 및 5자리로 구성된 ID 번호를 찾습니다. | /<(.*)>.*</1>/ | "<(.*)>.*</1>" | HTML 태그를 찾습니다. | 아래 표는 정규식 컨텍스트에 사용되는 모든 메타문자와 메타문자의 동작을 보여줍니다. 문자 설명 | 그 다음 문자를 특수 문자, 리터럴, 역참조, 또는 8진수 이스케이프로 표시합니다. 예를 들어, "n"은 문자 "n"을 찾고 "n"은 줄 바꿈 문자를 찾습니다. "" 시퀀스는 ""를 찾고 "("는 "("를 찾습니다. | ^ | 입력 문자열의 시작 위치를 찾습니다. Multiline 속성이 설정되어 있으면 ^는 'n' 또는 'r'앞의 위치를 찾습니다. | $ | 입력 문자열의 끝 위치를 찾습니다. Multiline 속성이 설정되어 있으면 $는 'n' 또는 'r'뒤의 위치를 찾습니다. | * | 부분식의 선행 문자를 0개 이상 찾습니다. 예를 들어, "zo*"는 "z", "zoo" 등입니다. *는 {0,}와 같습니다. | + | 부분식의 선행 문자를 한 개 이상 찾습니다. 예를 들어, "zo+"는 "zo", "zoo" 등이지만 "z"는 아닙니다. +는 {1,}와 같습니다. | ? | 부분식의 선행 문자를 0개 또는 한 개 찾습니다. 예를 들어, "do(es)?"는 "do" 또는 "does"의 "do"를 찾습니다. ?는 {0,1}과 같습니다. | { 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?"와 같습니다. 쉼표와 숫자 사이에는 공백을 넣을 수 없습니다. | ? | 이 문자가 다른 한정 부호(*, +, ?, { n }, { n ,}, { n , m })의 바로 뒤에 나올 경우 일치 패턴은 제한적입니다. 기본값인 무제한 패턴은 가능한 많은 문자열을 찾는 데 반해 제한적인 패턴은 가능한 적은 문자열을 찾습니다. 예를 들어, "oooo" 문자열에서 "o+?"는 "o" 한 개만 찾고, "o+"는 모든 "o"를 찾습니다. | . | "n"을 제외한 모든 단일 문자를 찾습니다. "n"을 포함한 모든 문자를 찾으려면 '[.n]' 패턴을 사용하십시오. | ( pattern ) | pattern 을 찾아 검색한 문자열을 캡처합니다. 캡처한 문자열은 VBScript의 경우 SubMatches 컬렉션, Jscript의 경우 $0 ... $9 속성을 이용하여 결과로 나오는 Matches 컬렉션에서 추출할 수 있습니다. 괄호 문자인 ( )를 찾으려면 "(" 또는 ")"를 사용하십시오. | (?: pattern ) | pattern 을 찾지만 검색한 문자열을 캡처하지 않습니다. 즉, 검색한 문자열을 나중에 사용할 수 있도록 저장하지 않는 비캡처 검색입니다. 이것은 패턴의 일부를 "or" 문자(|)로 묶을 때 유용합니다. 예를 들어, 'industr(?:y|ies)는 'industry|industries'보다 더 경제적인 식입니다. | (?= pattern ) | 포함 예상 검색은 pattern 과 일치하는 문자열이 시작하는 위치에서 검색할 문자열을 찾습니다. 이것은 검색한 문자열을 나중에 사용할 수 있도록 캡처하지 않는 비캡처 검색입니다. 예를 들어, "Windows(?=95|98|NT|2000)"는 "Windows 2000"의 "Windows"는 찾지만 "Windows 3.1"의 "Windows"는 찾지 않습니다. 예상 검색은 검색할 문자열을 찾은 후 예상 검색 문자열을 구성하는 문자 다음부터가 아니라 마지막으로 검색한 문자열 바로 다음부터 찾기 시작합니다. | (?! pattern ) | 제외 예상 검색은 pattern 과 일치하지 않는 문자열이 시작하는 위치에서 검색할 문자열을 찾습니다. 이것은 검색한 문자열을 나중에 사용할 수 있도록 캡처하지 않는 비캡처 검색입니다. 예를 들어, "Windows(?!95|98|NT|2000)"는 "Windows 3.1"의 "Windows"는 찾지만 "Windows 2000"의 "Windows"는 찾지 않습니다. 예상 검색은 검색할 문자열을 찾은 후 예상 검색 문자열을 구성하는 문자 다음부터가 아니라 마지막으로 검색한 문자열 바로 다음부터 찾기 시작합니다. | x | y | x 또는 y 를 찾습니다. 예를 들어, "z|food"는 "z" 또는 "food"를 찾습니다. "(z|f)ood"는 "zood" 또는 "food"를 찾습니다. | [ xyz ] | 문자 집합입니다. 괄호 안의 문자 중 하나를 찾습니다. 예를 들어, "[abc]"는 "plain"의 "a"를 찾습니다. | [^ xyz ] | 제외 문자 집합입니다. 괄호 밖의 문자 중 하나를 찾습니다. 예를 들어, "[^abc]"는 "plain"의 "p"를 찾습니다. | [ a-z ] | 문자 범위입니다. 지정한 범위 안의 문자를 찾습니다. 예를 들어, "[a-z]"는 "a"부터 "z" 사이의 모든 소문자를 찾습니다. | [^ a-z ] | 제외 문자 범위입니다. 지정된 범위 밖의 문자를 찾습니다. 예를 들어, "[^a-z]"는 "a"부터 "z" 사이에 없는 모든 문자를 찾습니다. | b | 단어의 경계, 즉 단어와 공백 사이의 위치를 찾습니다. 예를 들어, "erb"는 "never"의 "er"는 찾지만 "verb"의 "er"는 찾지 않습니다. | B | 단어의 비경계를 찾습니다. "erB"는 "verb"의 "er"는 찾지만 "never"의 "er"는 찾지 않습니다. | c x | X 가 나타내는 제어 문자를 찾습니다. 예를 들어, cM은 Control-M 즉, 캐리지 리턴 문자를 찾습니다. x 값은 A-Z 또는 a-z의 범위 안에 있어야 합니다. 그렇지 않으면 c는 리터럴 "c" 문자로 간주됩니다. | d | 숫자 문자를 찾습니다. [0-9]와 같습니다. | D | 비숫자 문자를 찾습니다. [^0-9]와 같습니다. | f | 폼피드 문자를 찾습니다. x0c와 cL과 같습니다. | n | 줄 바꿈 문자를 찾습니다. x0a와 cJ와 같습니다. | r | 캐리지 리턴 문자를 찾습니다. x0d와 cM과 같습니다. | s | 공백, 탭, 폼피드 등의 공백을 찾습니다. "[ fnrtv]"와 같습니다. | S | 공백이 아닌 문자를 찾습니다. "[^ fnrtv]"와 같습니다. | t | 탭 문자를 찾습니다. x09와 cI와 같습니다. | v | 수직 탭 문자를 찾습니다. x0b와 cK와 같습니다. | w | 밑줄을 포함한 모든 단어 문자를 찾습니다. "[A-Za-z0-9_]"와 같습니다. | W | 모든 비단어 문자를 찾습니다. "[^A-Za-z0-9_]"와 같습니다. | x n | n 을 찾습니다. 여기서 n 은 16진수 이스케이프 값입니다. 16진수 이스케이프 값은 정확히 두 자리여야 합니다. 예를 들어, 'x41'은 "A"를 찾고 'x041'은 'x04'와 "1"과 같습니다. 정규식에서 ASCII 코드를 사용할 수 있습니다. | num | num 을 찾습니다. 여기서 num 은 양의 정수입니다. 캡처한 문자열에 대한 역참조입니다. 예를 들어, '(.)1'은 연속적으로 나오는 동일한 문자 두 개를 찾습니다. | n | 8진수 이스케이프 값이나 역참조를 나타냅니다. n 앞에 최소한 n개의 캡처된 부분식이 나왔다면 n 은 역참조입니다. 그렇지 않은 경우 n 이 0에서 7 사이의 8진수이면 n 은 8진수 이스케이프 값입니다. | nm | 8진수 이스케이프 값이나 역참조를 나타냅니다. nm 앞에 최소한 nm개의 캡처된 부분식이 나왔다면 nm 은 역참조입니다. nm 앞에 최소한 n개의 캡처가 나왔다면 n 은 역참조이고 뒤에는 리터럴 m이 옵니다. 이 두 경우가 아닐 때 n과 m이 0에서 7 사이의 8진수이면 nm 은 8진수 이스케이프 값 nm을 찾습니다. | nml | n 이 0에서 3 사이의 8진수이고 m 과 l 이 0에서 7 사이의 8진수면 8진수 이스케이프 값 nml 을 찾습니다. | u n | n 은 4 자리의 16진수로 표현된 유니코드 문자입니다. 예를 들어, u00A9는 저작권 기호(©)를 찾습니다. | -------------------------------------------------------------------------------- VisualBasicScriptingEdition에서정규표현식기능이용하기 --------------------------------------------------------------------------------
정규표현식이란무엇인가요? 정규표현식이란무엇일까요?정규표현식은복잡한패턴매칭기능과텍스트형검색-대체알고리즘을개발할수있는툴을제공합니다.Perl,egrep,awk,또는sed개발자에게정규표현식이무엇이냐고물어보면,정규표현식은텍스트와데이터를조작할때사용할수있는가장강력한유틸리티라고대답할것입니다.개발자는패턴을만들어특정문자열을매치키시킴으로써데이터를검색하거나추출하거나교체하는일을완벽하게제어할수있습니다.간단히말해서,정규표현식을정복하면데이터도정복할수있는것입니다.
여기서는,VBScript정규표현식과관련된모든개체를설명하고,일반적인정규표현식패턴을간략하게살펴보고,실제코드로정규표현식을사용하는예를들어보도록합시다.
VBScriptRegExp개체 VBScript5.0버전은정규표현식을하나의개체로서제공합니다.VBScriptRegExp개체는설계면에서JScript의RegExp및String개체와비슷하고,구문면에서는VisualBasic과일치합니다.먼저,VBSciptRegExp개체의속성과메소드에관해알아봅시다.VBScriptRegExp개체는사용자에게세개의속성과세개의메소드를제공합니다.
속성메소드 PatternTest(검색-문자열) IgnoreCaseReplace(검색-문자열,대체-문자열) GlobalExecute(검색-문자열
Pattern-정규표현식을정의하는데사용되는문자열.이속성은정규표현식개체를사용하기전에먼저설정해야합니다.Pattern에관한내용은아래에자세히설명되어있습니다. IgnoreCase-문자열안에서일치하는문자가발생할모든가능성에대해정규표현식을테스트해야하는지를나타내는부울논리속성입니다.IgnoreCase의기본설정값은False입니다. Global-문자열안에서일치하는문자가발생할모든가능성에대해정규표현식을테스트해야하는지여부를나타내는읽기전용부울논리속성입니다.Global의기본설정값은False입니다. Test(문자열)-Test메소드는문자열을매개변수로받아그문자열이정규표현식에일치하면True를반환하고그렇지않으면False를반환합니다. Replace(검색-문자열,대체-문자열)-Replace메소드는두개의문자열을매개변수로받습니다.검색-문자열안에정규표현식과일치하는문자열이있으면,그문자열을대체-문자열로바꾸고,바뀐새로운문자열을반환합니다.만일일치하는문자열이없으면,원래의검색-문자열을반환합니다. Execute(검색-문자열)-Execute메소드는Matches컬렉션개체를반환하는점만제외하면Replace메소드의작동과비슷합니다.Matches컬렉션개체에는정규표현식에일치하는각문자열에대한Match개체가들어있습니다.이메소드는원래의문자열을변경하지않습니다. 더자세한내용과예제코드는,MicrosoftScriptingSite사이트를참고하시기바랍니다.
VBScriptMatches컬렉션개체 앞에서말했듯이,Matches컬렉션개체는Execute메소드를실행한경우에만반환됩니다.이컬렉션개체는0개이상의Match개체를포함할수있으며,이개체의속성은읽기전용입니다.
속성 Count Item
Count-컬렉션안에있는Match개체의개수를나타내는읽기전용값입니다. Item-Matches컬렉션개체에서Match개체를임의로액세스할수있게만드는읽기전용값입니다.For-Next루프를사용하면,Matches컬렉션개체에서Match개체를순서대로액세스할수도있습니다. 더자세한내용과예제코드는,MicrosoftScriptingSite를참고하시기바랍니다.
VBScriptMatch개체 각Mathes개체에는0개이상의Match개체가들어있습니다.이Match개체들은정규표현식을사용했을때성공적으로일치한문자열을나타냅니다.이개체의속성은읽기전용이며일치하는각문자열에대한정보를저장합니다.
속성 FirstIndex Length Value
FirstIndex-원래문자열안에서정규표현식에일치하는문자열의위치를나타내는읽기전용값입니다.이색인은위치를기록하는데0기준오프셋(문장의첫위치가0번째임을뜻함)을사용합니다. Length-일치된문자열의전체길이를나타내는읽기전용값입니다 Value-일치된값이나텍스트를나타내는읽기전용값입니다.이값은Match개체를액세스할때사용되는기본값이기도합니다. 더자세한내용과예제코드는,MicrosoftScriptingSite를참고하시기바랍니다.
패턴은어떤형태인가? 자,지금까지는이모든것이지나치게훌륭하고환상적인것으로느껴지셨겠지만실제는어떨까요?정규표현식은그자체가하나의언어라고할수있지만,Perl에익숙한사용자들이라면누구나쉽게사용할수있습니다.VBScript는Perl로부터패턴셋을유도하기때문에,주요기능도Perl과비슷합니다.그러면,정규표현식을정의하는데사용되는패턴셋몇가지를살펴보도록합시다.패턴셋은여러범주와영역으로분류할수있습니다.
포지션매칭
포지션매칭은^와$(을)를사용하여문자열의시작이나끝을검색합니다.패턴속성을"^VBScript"로설정할경우,"VBScriptiscool."에는일치하지만,"IlikeVBScript."에는일치하지않습니다.
기호기능 ^문자열의시작만비교합니다
"^A"는"AnA+forAnita."의첫번째"A"를비교합니다. $문자열의끝을비교합니다.
"t$"는"Acatinthehat"의마지막"t"를비교합니다. b임의의워드영역을비교합니다
"lyB"는"possiblytomorrow."의"ly"를비교합니다 BMatchesanynon-wordboundary
리터럴
리터럴은영숫자문자,ASCII,8진수문자,16진수문자,UNICODE,또는특수구분문자등을모두총칭하는말입니다.특별한의미를갖고있는몇몇문자는구분해야합니다.이들특수문자를비교하려면,정규표현식을문자앞에를사용해야합니다.
기호기능 영숫자영문자와숫자를비교합니다. n새로운라인을비교합니다 f용지공급을비교합니다 r캐리지리턴을비교합니다. t가로탭을비교합니다. v수평탭을비교합니다. ??(을)를비교합니다. **(을)를비교합니다. ++(을)를비교합니다. ..(을)를비교합니다. ||(을)를비교합니다. {{(을)를비교합니다. }}(을)를비교합니다. (을)를비교합니다. [[(을)를비교합니다. ]](을)를비교합니다. (((을)를비교합니다. ))(을)를비교합니다. xxx8진수xxx로표시된ASCII문자를비교합니다.
"50"은"("또는chr(40)(을)를비교합니다. xdd16진수dd로표시된ASCII문자를비교합니다.
"x28"은"("또는chr(40)(을)를비교합니다. uxxxxUNICODExxxx로표시된ASCII문자를비교합니다.
"u00A3"은"£"를비교합니다.
문자클래스
문자클래스를사용하면괄호[]안에식을삽입하여사용자에의해정의된그룹을만들수있습니다.문자클래스의문자들을제외한나머지문자들을사용하려면[]안에^(을)를첫번째문자로삽입해야합니다.또한,문자의범위를지정할때는대시를사용합니다.예를들어,정규표현식"[^a-zA-Z0-9]"(은)는영문자와숫자를제외한모든문자를비교합니다.추가로구분문자와리터럴로묶인문자셋도있습니다.
기호기능 [xyz]문자셋안에포함되어있는임의의한문자를비교합니다.
"[a-e]"(은)는"basketball"안의"b"를비교합니다. [^xyz]문자셋안에포함되어있지않은임의의한문자를비교합니다.
"[^a-e]"는"basketball"안의"s"를비교합니다. .n을제외한임의의문자를비교합니다. w임의의워드문자를비교합니다. [a-zA-Z_0-9]와동일함. W워드문자를제외한임의의문자를비교합니다. [^a-zA-Z_0-9]와동일함. d임의의숫자를비교합니다.[0-9]. D숫자를제외한임의의문자를비교합니다. [^0-9]와동일함. s임의의공백문자를비교합니다. [trnvf]와동일함. S공백문자가아닌임의의문자를비교합니다. [^trnvf]와동일함.
반복
반복매칭을사용하면정규표현식안에있는특정절에대한검색을여러번수행할수있습니다.반복매칭에서는어떤요소가정규표현식안에서몇번반복될것인지를지정할수있습니다.
기호기능 {x}{x}정규표현식을x번비교합니다.
"d{5}"는5개의숫자를비교합니다. (x,}정규표현식을x번이상비교합니다.
"s{2,}"는최소한두개의공백문자를비교합니다 {x,y}정규표현식을x부터y번까지비교합니다.
"d{2,3}"는2개이상3개미만의숫자를비교합니다.. ?0번또는한번비교합니다.{0,1}와동일함.
"as?b"는"ab"또는"ab"를비교합니다. *0번이상비교합니다.{0,}와동일함. +한번이상비교합니다.{1,}과동일함.
교체와그룹핑
교체와그룹핑은보다복잡한정규표현식을만들때사용합니다.교체와그룹핑기술은정규표현식안에복잡한절을만들고,보다많은융통성과제어능력을제공합니다.
기호기능 ()절을그룹핑하여절을만듭니다.중첩하여사용할수도있습니다.
"(ab)?(c)"는"abc"또는"c"를비교합니다. |교체는여러절을하나의정규표현식으로조합한다음개별적인절을비교합니다.
"(ab)|(cd)|(ef)"는"ab"또는"cd"또는"ef"를비교합니다.
역방향참조
프로그래머는역방향참조를통해정규표현식의일부를다시참조할수있습니다.그방법은괄호와백슬레시()뒤에한개의숫자를사용하는것입니다.첫번째괄호절은1로참조되고두번째괄호절은2로참조되는식입니다.
기호기능 ()n왼쪽괄호에있는표현식을n번반복해서문장을비교합니다.
"(w+)s+1"는"hubbahubba"같이,한열안에서두번나타나는임의의워드를비교합니다.."
예제로확인하기! 이예제는지금까지설명한것을적용한것으로,정규표현식을이용하여유효한입력값이입력되어있는지검사하는간단한응용프로그램입니다.사용자가유효한값을입력할때까지사용자에게입력을요구하는프롬프트가반복적으로나타납니다.먼저초기패턴을자세히설명하겠습니다.
"^s*(($s?)|(£s?))?((d+(.(dd)?)?)|(.dd))s*(UK|GBP|GB|USA|US|USD)?)s*$"
"^s*…"와"…s*$"-앞과뒤에몇개의공백문자든지올수있음을나타내며,입력은반드시라인자체위에있어야합니다. "(($s?)|(?s?))?"-옵션공백앞에오는옵션$또는£기호를나타냅니다.. "((d+(.(dd)?)?)|(.dd))"-생략가능한십진수소수점2자리또는십진수소수점2자리수앞에오는한자리이상의숫자를찾습니다.이말은6.,23.33,.88와같은숫자는사용가능하나5.5는사용할수없음을의미합니다. "s*(UK|GBP|GB|USA|US|USD)?"-문자열에대하여생략및사용이가능하고인수앞에서유효한공백문자의수를의미합니다. 본예제의경우,정규표현식은사용자의US달러또는영국파운드입력여부를결정하는데사용됩니다.필자는£,UK,GBP,또는GB문자열을검색하고있습니다.정규표현식결과가참이면사용자는영국파운드단위의액수를입력한것이라고보면됩니다.그렇지않다면USD통화를사용한것이겠지요.
이코드를사용하려면코드를CurrencyEx.vbs로저장하고WindowsScriptHost를이용해코드를실행시킨다음VB에복사하거나(이경우,MicrosoftVBScript정규표현식에참조를추가할필요가있음)HTML파일에코드를포함시킵니다.
SubCurrencyEx Diminputstr,re,amt Setre=newregexp'CreatetheRegExpobject
'Asktheuserfortheappropriateinformation inputstr=inputbox("IwillhelpyouconvertUSAandCANcurrency.Pleaseentertheamounttoconvert:") 'Checktoseeiftheinputstringisavalidone. re.Pattern="^s*(($s?)|(£s?))?((d+(.(dd)?)?)|(.dd))s*(UK|GBP|GB|USA|US|USD)?)s*$" re.IgnoreCase=true dowhilere.Test(inputstr)<>true 'Promptforanotherinputifinputstrisnotvalid inputstr=inputbox("IwillhelpyouconvertUSAandGBPcurrency.Pleaseentertheamountto(USDorGBP):")
loop 'DetermineifwearegoingfromGBP->USorUSA->GBP re.Pattern="£|UK|GBP|GB" ifre.Test(inputstr)then 'TheuserwantstogofromGBP->USD
re.Pattern="[a-z$£]" re.Global=True amt=re.Replace(inputstr,"") amt=amt*1.6368 amt=cdbl(cint(amt*100)/100) amt="$"&amt else 'TheuserwantstogofromUSD->GBP
re.Pattern="[a-z$£]" re.Global=True amt=re.Replace(inputstr,"") amt=amt*0.609 amt=cdbl(cint(amt*100)/100) amt="£"&amt endif
msgbox("Youramountof:"&vbTab&inputstr&vbCrLf&"isequalto:"&vbTab&amt) Endsub
더욱강력한파워를! VisualBasic개발자들이정규표현식을사용할수있도록VBScript정규표현식엔진은COM개체로구현되어왔습니다.이경우,정규표현식은보다강력한힘을발휘하게되는데즉,VisualBasic또는C와같은VBScript외의다양한소스로부터호출이가능하기때문입니다.예컨대,필자는Outlook(R)97,Outlook98또는Outlook2000의접속목록을통해내용을추적하고특정도시에사는접속자이름을반환하는작은VisualBasic응용프로그램을만든경험이있습니다.
이프로그램은매우간단합니다.먼저사용자는검색할대상도시명을입력하고,구분표시에는쉼표를사용합니다.그런다음,Outlook에작성할새접속폴더의이름을입력합니다.각접속이일치하면이내용은새로작성된접속폴더에복사됩니다.
MicrosoftVBScript정규표현식개체라이브러리에참조를추가할경우몇가지유용한조기바인딩기능(earlybinding)을사용할수있습니다.이조기바인딩개체는몇가지이점을제공하는데즉,속도가빠르고코딩프로그램사용이간편하다는점입니다."newRegExp"가즉시사용되므로사용자는개체에참조를추가하고VBScript코드를오려내어VB에그대로붙일수있습니다.
이러한이유로필자또한정규표현식과동일한방법을사용하여Outlook9.0개체라이브러리를참조한적이있습니다.물론,여러분은여전히CreateObject()(을)를사용하여COM호출을생성시킬수도있으나상기방법을더간편하게사용할수있을것입니다.이개체들을작성한후간단한코드를사용하여도시명과일치하는폴더와트리를액세스할수있습니다.본인은2개의모음개체를가지는작은도움함수compareCollectionObjects(x,y)(을)를사용/비교하여일치여부를확인합니다.
이프로그램을사용하려면단순히코드를VB(참조추가에필요함)에복사한다음FindCityContacts()함수를호출하면됩니다..
SubFindCityContacts()
DimstrTemp Dimindex DimcitySearch DimmyNameSpace,myContacts,newCityContacts,newCityContactsName Dimcontact DimnewContact
'Settheearlybindingobjects DimreasNewRegExp DimmyAppasNewOutlook.Application
re.Global=True re.IgnoreCase=True
citySearch=InputBox("Pleaseenterthecitiesofyoursearch,separatedbycommas.") newCityContactsName=InputBox("Pleaseenterthenewcontactfoldername")
'SetsomeoftheobjectsandcreatethenewContactsfolder SetmyNameSpace=myApp.GetNamespace("MAPI") 'olFolderContacts=10 SetmyContacts=myNameSpace.GetDefaultFolder(10) SetnewCityContacts=myContacts.Folders.Add(newCityContactsName)
'Setcities,usingregularexpressionstocontainthecitynames re.Pattern="[^,]+" Setcities=re.Execute(citySearch) ForEachcityIncities
'Setcitytokenstobetheindividualtokensinthecityname 'Thenwecomparethemtotheaddresstokensineachcontact re.Pattern="[^]+" Setcitytokens=re.Execute(city)
Fori=1tomyContacts.Items.Count re.Pattern="[^]+" Setcontact=myContacts.Items.Item(i)
SetHomeAddressCityTokens=re.Execute(contact.HomeAddressCity) IfcompareCollectionObjects(HomeAddressCityTokens,citytokens)=1Then
SetnewContact=contact.Copy newContact.MovenewCityContacts EndIf
SetOtherAddressCityTokens=re.Execute(contact.OtherAddressCity) IfcompareCollectionObjects(OtherAddressCityTokens,citytokens)=1Then SetnewContact=contact.Copy newContact.MovenewCityContacts EndIf
SetBusinessAddressCityTokens=re.Execute(contact.BusinessAddressCity) IfcompareCollectionObjects(BusinessAddressCityTokens,citytokens)=1Then SetnewContact=contact.Copy newContact.MovenewCityContacts EndIf Next Next
MsgBox"done"
EndSub
'Thisfunctionisprovidedasahelper-function 'tocomparetwocollectionobjects. FunctioncompareCollectionObjects(x,y)
Dimindex Dimflag flag=1
Ifx.Count<>y.CountThen flag=0 Else index=x.Count
Fori=0To(index-1) IfStrComp(x.Item(i),y.Item(i),1)Then flag=0 EndIf Next EndIf
compareCollectionObjects=flag
EndFunction
넘치는정보! 앞에서보았듯이,Microsoft는정규표현식(버전5.0)을이용하여VBSscript를강화시키는데,이것은VBScript와Jscript비교에서가장중요한부분이었습니다.스크립팅엔진버전5.0에서우리는VBScript의기능을향상시키는데특히비중을두었습니다.이제여러분은정규표현식을추가시킴으로써데이터를보다확실하게관리하고그효과를높일수있게되었으며,클라이언트와서버에서보다강력한웹응용프로그램을만들수있게되었습니다. |