본문 바로가기

Programming

[펌] 정규식 패턴 (이것만 있으면 모든 프로그램 다 짠다!!)

출처 : http://www.pention.net/sir/bbs/board.php?bo_table=infoProgram&wr_id=158 

정규식은 일반 문자(예: a에서 z)와 메타문자로 알려진 특수 문자로 구성된 문자열 패턴이다.
패턴은 문자열 본문을 검색할 때 일치하는 문자열을 설명한다.
정규식은 검색되는 문자열과 일치하는 문자 패턴을 찾는 템플릿의 역할을 한다.

일반적으로 볼 수 있는 몇 가지 정규식 예는 다음과 같다.

출력 공통 <scRIPT> var s,re; function showChar(){ sindex=s.search(re); slastIndex=RegExp.lastIndex; document.write(sindex+'~'+RegExp.lastIndex); document.write(' ('+s.substring(sindex,slastIndex)+')'); } </scRIPT>
<scRIPT>var s,re;
function showChar(){
  sindex=s.search(re);
  slastIndex=RegExp.lastIndex;
  document.write(sindex+'~'+slastIndex+' ('+s.substring(sindex,slastIndex)+')');
}</scRIPT>
정규식검색결과
/\d{2}-\d{5}/ 2자리, 하이픈 및 5자리로 구성된 ID 번호를 찾는다.
s='6aa-a012-1234544-2345';re=/\d{2}-\d{5}/;showChar() <scRIPT>s='6aa-a012-1234544-2345';re=/\d{2}-\d{5}/;showChar()</scRIPT> 6~14 (12-12345)
/<(.*)>.*<\/\1>/ HTML 태그를 찾는다.
s='koxo.com';re=/<(\w)(.*)>.*<\/\1>/;showChar() <scRIPT>s='koxo.com';re=/<(\w)(.*)>.*<\/\1>/;showChar()</scRIPT> 0~36 (koxo.com)

아래 표는 정규식 컨텍스트에 사용되는 모든 메타문자와 그 동작을 보여준다.

문자설명결과
\ 그 다음 문자를 특수 문자, 리터럴, 역참조, 또는 8진수 이스케이프로 표시한다. 예를 들어, 'n'은 문자 "n"을 찾고 '\n'은 줄 바꿈문자를 찾는다. '\\' 시퀀스는 "\"를 찾고 '\('는 "("를 찾는다.
s='abc\(dd\)ee';re=/\(/;showChar() <scRIPT>s='abc\(dd\)ee';re=/\(/;showChar()</scRIPT> 3~4 (()
^ 입력 문자열의 시작 위치를 찾는다. multiline 속성이 설정되어 있으면 ^는 '\n' 또는 '\r' 앞의 위치를 찾는다.
s='Aa bb cc dd\nee ff';re='^;showChar() <scRIPT>s='Aa bb cc dd\nee ff';re='^';showChar()</scRIPT> 0~1 (A)
$ 입력 문자열의 끝 위치를 찾는다. multiline 속성이 설정되어 있으면 $는 '\n' 또는 '\r' 뒤의 위치를 찾는다.
s='aa bb cc dd\nee fF';re='$;showChar() <scRIPT>s='aa bb cc dd\nee fF';re='$';showChar()</scRIPT> 17~18 ()
* 부분식의 선행 문자를 0개 이상 찾는다. 예를 들어, 'zo*'는 "z", "zoo" 등이다. *는 {0,}와 같다.
s='aa bb CCd dd\ncc ff';re='CC*;showChar() <scRIPT>s='aa bb CCd dd\ncc ff';re='CC*';showChar()</scRIPT> 6~8 (CC)
+ 부분식의 선행 문자를 한 개 이상 찾는다.
예를 들어, 'zo+'는 "zo", "zoo" 등이지만 "z"는 아니다. +는 {1,}와 같다.
s='aa bb CC0 dd\nccc ff';re='CC+;showChar() <scRIPT>s='aa bb CC0 dd\nccc ff';re='CC+';showChar()</scRIPT> 6~8 (CC)
? 부분식의 선행 문자를 0개 또는 한 개 찾는다.
예를 들어, "do(es)?"는 "do" 또는 "does"의 "do"를 찾는다. ?는 {0,1}과 같다.
s='aa bb C0 dd\nccc ff';re='CC?';showChar() <scRIPT>s='aa bb C0 dd\nccc ff';re='CC?';showChar()</scRIPT> 6~7 (C)
{n} n은 음이 아닌 정수이다. 정확히 n개 찾는다.
예를 들어, 'o{2}'는 "Bob"의 "o"는 찾지 않지만 "food"의 o 두 개는 찾는다.
s='aa bb c0 dd\nCCc ff';re='C{2};showChar() <scRIPT>s='aa bb c0 dd\nCCc ff';re='C{2}';showChar()</scRIPT> 12~14 (CC)
{n,} n은 음이 아닌 정수이다. 정확히 n개 찾는다. 예를 들어, 'o{2}'는 "Bob"의 "o"는 찾지 않지만 "foooood"의 모든 o는 찾는다. 'o{1,}'는 'o+'와 같고, 'o{0,}'는 'o*'와 같다.
s='aa bb cC0 dd\ncCc ff';re='C{2,}';document.write(s.search(re))
s='aa bb cC0 dd\ncCCc ff';re='C{2,};showChar()
<scRIPT>s='aa bb cC0 dd\ncCcc ff';re='C{2,}';document.write(s.search(re))</scRIPT> -1 (없다)
<scRIPT>s='aa bb cC0 dd\ncCCc ff';re='C{2,}';showChar()</scRIPT> 14~16 (CC)
{n,m} m과 n은 음이 아닌 정수이다. 여기서 m은 n보다 크거나 같다. 최소 n개, 최대 m개 찾는다.
예를 들어, "o{1,3}"은 "gooooood"의 처음 세 개의 o를 찾는다. "o{0,1}"은 "o?"와 같다. 쉼표와 숫자 사이에는 공백을 넣을 수 없다.
s='aa bb cc0 dd\nCCCc ff';re='C{2,3};showChar() <scRIPT>s='aa bb cc0 dd\nCCCc ff';re='C{2,3}';showChar()</scRIPT> 13~16 (CCC)
? 이 문자가 다른 한정 부호(*, +, ?, {n}, {n,}, {n,m})의 바로 뒤에 나올 경우 일치 패턴은 제한적이다. 기본값인 무제한 패턴은 가능한 많은 문자열을 찾는 데 반해 제한적인 패턴은 가능한 적은 문자열을 찾는다. 예를 들어, "oooo" 문자열에서 "o+?"는 "o" 한 개만 찾고, "o+"는 모든 "o"를 찾는다.
s='aa bb CC0 dd\nCCCc ff';re='CCC+?;showChar() <scRIPT>s='aa bb CC0 dd\nCCC ff';re='CCC+?';showChar()</scRIPT> 13~16 (CCC)
. "\n"을 제외한 모든 단일 문자를 찾는다. "\n"을 포함한 모든 문자를 찾으려면 '[.\n]' 패턴을 사용하라.
s='aa bb cc0 dd\ncccc ff';re='.';showChar()
s='aa\n bb cc0 ddcccc ff';re='.\n';showChar()
s='aa b\nb cc0 ddcccc ff';re='.\n;showChar()
<scRIPT>s='aa bb cc0 dd\ncccc ff';re='.';showChar()</scRIPT> 0~1 (a)
<scRIPT>s='aa\n bb cc0 ddcccc ff';re='.\n';showChar()</scRIPT> 1~3 ()
<scRIPT>s='aa b\nb cc0 ddcccc ff';re='.\n';showChar()</scRIPT> 3~5 ()
(pattern) pattern을 찾아 검색한 문자열을 캡처한다. 캡처한 문자열은 VBscript의 경우 SubMatches 컬렉션, Javascript의 경우 $1...$9 속성을 이용하여 결과로 나오는 Matches 컬렉션에서 추출할 수 있다. 괄호 문자인 ( )를 찾으려면 "\(" 또는 "\)"를 사용하라.
s='aa bb cc0 dd\nccc ff';re='(b c)'';showChar());document.write(' '+RegExp.$1) <scRIPT>s='aa bb cc0 dd\nccc ff';re='(b c)';showChar();document.write(' '+RegExp.$1)</scRIPT> 4~7 (b c) b c
(?:pattern) pattern을 찾지만 검색한 문자열을 캡처하지 않다. 즉, 검색한 문자열을 나중에 사용할 수 있도록 저장하지 않는 비캡처 검색이다. 이것은 패턴의 일부를 "or" 문자(|)로 묶을 때 유용한다. 예를 들어, 'industr(?:y|ies)는 'industry|industries'보다 더 경제적인 식이다.
s='aa bb cc0 dd\nccc ff';re='(?:bb|cc);showChar() <scRIPT>s='aa bb cc0 dd\nccc ff';re='(?:bb|cc)';showChar()</scRIPT> 3~5 (bb)
(?=pattern) 포함 예상 검색은 pattern과 일치하는 문자열이 시작하는 위치에서 검색할 문자열을 찾는다. 이것은 검색한 문자열을 나중에 사용할 수 있도록 캡처하지 않는 비캡처 검색이다. 예를 들어, "Windows(?=95|98|NT|2000)"는 "Windows 2000"의 "Windows"는 찾지만 "Windows 3.1"의 "Windows"는 찾지 않다. 예상 검색은 검색할 문자열을 찾은 후 예상 검색 문자열을 구성하는 문자 다음부터가 아니라 마지막으로 검색한 문자열 바로 다음부터 찾기 시작한다.
s='aa bb cc0 dd\nccc ff';re='(?=ccc);showChar() <scRIPT>s='aa bb cc0 dd\nccc ff';re='(?=ccc)';showChar()</scRIPT> 13~14 (c)
(?!pattern) 제외 예상 검색은 pattern과 일치하지 않는 문자열이 시작하는 위치에서 검색할 문자열을 찾는다. 이것은 검색한 문자열을 나중에 사용할 수 있도록 캡처하지 않는 비캡처 검색이다. 예를 들어, "Windows(?!95|98|NT|2000)"는 "Windows 3.1"의 "Windows"는 찾지만 "Windows 2000"의 "Windows"는 찾지 않다. 예상 검색은 검색할 문자열을 찾은 후 예상 검색 문자열을 구성하는 문자다음부터가 아니라 마지막으로 검색한 문자열 바로 다음부터 찾기 시작한다.
s='abb cc0 dd\nccc ff';re='(?!a);showChar() <scRIPT>s='aa bb cc0 dd\nccc ff';re='(?!aa)';showChar()</scRIPT> 1~2 (a)
x|y x 또는 y를 찾는다. 예를 들어, "z|food"는 "z" 또는 "food"를 찾는다. "(z|f)ood"는 "zood" 또는 "food"를 찾는다.
s='aa bb cc0 dd\nccc ff';re='bb|cc;showChar() <scRIPT>s='aa bb cc0 dd\nccc ff';re='bb|cc';showChar()</scRIPT> 3~5 (bb)
[xyz] 문자 집합이다. 괄호 안의 문자 중 하나를 찾는다. 예를 들어, "[abc]"는 "plain"의 "a"를 찾는다.
s='aa bb cc0 dd\nccc ff';re='[xy0];showChar() <scRIPT>s='aa bb cc0 dd\nccc ff';re='[xy0]';showChar()</scRIPT> 8~9 (0)
[^xyz] 제외 문자 집합이다. 괄호 밖의 문자 중 하나를 찾는다. 예를 들어, "[^abc]"는 "plain"의 "p"를 찾는다.
s='aa bb cc0 dd\nccc ff';re='[^abc];showChar() <scRIPT>s='aa bb cc0 dd\nccc ff';re='[^abc]';showChar()</scRIPT> 2~3 ( )
[a-z] 문자 범위이다. 지정한 범위 안의 문자를 찾는다. 예를 들어, "[a-z]"는 "a"부터 "z" 사이의 모든 소문자를 찾는다.
s='aa bb cc0 dd\nccc ff';re='[c~z];showChar() <scRIPT>s='aa bb cc0 dd\nccc ff';re='[c~z]';showChar()</scRIPT> 6~7 (c)
[^a-z] 제외 문자 범위이다. 지정된 범위 밖의 문자를 찾는다. 예를 들어, "[^a-z]"는 "a"부터 "z" 사이에 없는 모든 문자를 찾는다.
s='aax bb cc0 dd\nccc ff';re='[^a~z];showChar() <scRIPT>s='aax bb cc0 dd\nccc ff';re='[^a~z]';showChar()</scRIPT> 2~3 (x)
\b 단어의 경계, 즉 단어와 공백 사이의 위치를 찾는다.
예를 들어, "er\b"는 "never"의 "er"는 찾지만 "verb"의 "er"는 찾지 않다.
s='aa bb cc ccc0 dd cccc ff';re=/c\b/';showChar() <scRIPT>s='aa bb cc ccc0 dd cccc ff';re=/c\b/;showChar()</scRIPT> 7~8 (c)
\B 단어의 비경계를 찾는다. "er\B"는 "verb"의 "er"는 찾지만 "never"의 "er"는 찾지 않다.
s='aa bb cc0 dd\ncccc ff';re=/cc\B/';showChar() <scRIPT>s='aa bb cc0 dd\ncccc ff';re=/cc\B/;showChar()</scRIPT> 6~8 (cc)
\cx X 가 나타내는 제어 문자를 찾는다. 예를 들어, \cM은 Control-M 즉, 캐리지 리턴 문자를 찾는다. x 값은 A-Z 또는 a-z의 범위 안에 있어야 한다. 그렇지 않으면 c는 리터럴 "c" 문자로 간주된다.
s=receivedString;re=/\ca/';showChar() 예제 생략
\d 숫자 문자를 찾는다. [0-9]와 같다.
s='aa bb cc012 dd\nccc ff';re=/\d/';showChar() <scRIPT>s='aa bb cc012 ee\nccc ff';re=/\d/;showChar()</scRIPT> 8~9 (0)
\D 비숫자 문자를 찾는다. [^0-9]와 같다.
s='17aa bb cc012 dd\nccc ff';re=/\D/';showChar() <scRIPT>s='17aa bb cc012 dd\nccc ff';re=/\D/;showChar()</scRIPT> 2~3 (a)
\f 폼피드 문자를 찾는다. \x0c와 \cL과 같다.
s='aa \fbb cc0 dd\nccc ff';re=/\f/';showChar() <scRIPT>s='aa \fbb cc0 dd\nccc ff';re=/\f/;showChar()</scRIPT> 3~4 ( )
\n 줄 바꿈 문자를 찾는다. \x0a와 \cJ와 같다.
s='aa bb cc\n0 ddccc ff\f';re=/\n/';showChar() <scRIPT>s='aa bb cc\n0 ddccc ff\f';re=/\n/;showChar()</scRIPT> 8~9 ( )
\r 캐리지 리턴 문자를 찾는다. \x0d와 \cM과 같다.
s='aa bb cc0 dd\nccc ff\r';re=/\r/';showChar() <scRIPT>s='aa bb cc0 dd\nccc ff\r';re='\r';showChar()</scRIPT> 19~20 ( )
\s 공백, 탭, 폼피드 등의 공백을 찾는다. "[ \f\n\r\t\v]"와 같다.
s='aa bb cc0 dd\nccc ff\t';re=/\s/';showChar() <scRIPT>s='aa bb cc0 dd\nccc ff\t';re=/\s/;showChar()</scRIPT> 2~3 ( )
\S 공백이 아닌 문자를 찾는다. "[^ \f\n\r\t\v]"와 같다.
s=' Aa bb cc0 dd\nccc ff\t';re=/\S/';showChar() <scRIPT>s=' Aa bb cc0 dd\nccc ff\t';re=/\S/;showChar()</scRIPT> 1~2 (A)
\t  문자를 찾는다. \x09와 \cI와 같다.
s='aa bb\t cc0 dd\nccc ff';re=/\t/';showChar() <scRIPT>s='aa bb\t cc0 dd\nccc ff';re=/\t/;showChar()</scRIPT> 5~6 ( )
\v 수직 탭 문자를 찾는다. \x0b와 \cK와 같다.
s='aa bb cc\v0 dd\nccc ff';re='\v;showChar() <scRIPT>s='aa bb cc\v0 dd\nccc ff';re='\v';showChar()</scRIPT> 8~9 (v)
\w 밑줄을 포함한 모든 단어 문자를 찾는다. "[A-Za-z0-9_]"와 같다.
s='+ / aa bb cc0 dd\nccc ff\t';re=/\w/';showChar() <scRIPT>s='+ / aa bb cc0 dd\nccc ff\t';re=/\w/;showChar()</scRIPT> 4~5 (a)
\W 모든 비단어 문자를 찾는다. "[^A-Za-z0-9_]"와 같다.
s='aa bb cc0 dd\nccc ff\t';re=/\W/';showChar() <scRIPT>s='aa bb cc0 dd\nccc ff\t';re=/\W/;showChar()</scRIPT> 2~3 ( )
\xn n을 찾는다. 여기서 n은 16진수 이스케이프 값이다. 16진수 이스케이프 값은 정확히 두 자리여야 한다. 예를 들어, '\x41'은 "A"를 찾고 '\x041'은 '\x04'와 "1"과 같다. 정규식에서 ASCII 코드를 사용할 수 있다.
s='aa bb cc0 dd\nccc ff\t';re='\x66;showChar() <scRIPT>s='aa bb cc0 dd\nccc ff\t';re='\x66';showChar()</scRIPT> 17~18 (f)
\num num을 찾는다. 여기서 num은 양의 정수이다. 캡처한 문자열에 대한 역참조이다. 예를 들어, '(.)\1'은 연속적으로 나오는 동일한 문자 두 개를 찾는다.
s='aa bb cc0 dd\nccc ff\t';re='\60';showChar() <scRIPT>s='aa bb cc0 dd\nccc ff\t';re='\60';showChar()</scRIPT> 8~9 (0)
\n 8진수 이스케이프 값이나 역참조를 나타낸다. \n 앞에 최소한 n개의 캡처된 부분식이 나왔다면 n은 역참조이다. 그렇지 않은 경우 n이 0에서 7 사이의 8진수이면 n은 8진수 이스케이프 값이다.
s='aa bb cc0 dd\nccc ff\t';re='\1;showChar() <scRIPT>s='aa bb cc0 dd\nccc ff\t';re='\7';showChar()</scRIPT> 10~11 ( )
\nm 8진수 이스케이프 값이나 역참조를 나타낸다. \nm 앞에 최소한 nm개의 캡처된 부분식이 나왔다면 nm은 역참조이다. \nm 앞에 최소한 n개의 캡처가 나왔다면 n은 역참조이고 뒤에는 리터럴 m이 온다다. 이 두 경우가 아닐 때 n과 m이 0에서 7 사이의 8진수이면 \nm은8진수 이스케이프 값 nm을 찾는다.
s='aa b\tb cc0 dd\nccc ff';re='\11;showChar() <scRIPT>s='aa b\tb cc0 dd\nccc ff';re='\11';showChar()</scRIPT> 4~5 ( )
\nml n이 0에서 3 사이의 8진수이고 m과 l이 0에서 7 사이의 8진수면 8진수 이스케이프 값 nml을 찾는다.
s='aa bbf cc0 dd\nccc f\t';re='\146;showChar() <scRIPT>s='aa bbf cc0 dd\nccc f\t';re='\146';showChar()</scRIPT> 5~6 (f)
\un n은 4 자리의 16진수로 표현된 유니코드 문자이다. 글자 엔티티(entity) 참조
s='a <scRIPT>document.write('&#'+parseInt('2260',16)+';')</scRIPT> ≠a bb cc0 dd\nccc ff\t';re='\u2260;showChar()
s='aa  bb cc0 dd\nccc ff\t';re='\u2030;showChar()
<scRIPT>s='a≠a bb cc0 dd\nccc ff\t';re=/\u2260/;showChar()</scRIPT> 1~2 ()
<scRIPT>s='aa ‰ bb cc0 dd\nccc ff\t';re=/\u2030/;showChar()</scRIPT> 3~4 ()