expression pattern

dev 2008. 8. 1. 17:40
Javascript Reqular Expression Pattern



자바스크립트뿐만 아니라 다른 언어의 정규식 표현들은 항상 잊어 버리기 싶단 말이지...

항상 할때 마다 생각이 나지 않아서 정리해 본다.

-------------------------------------------------------------------------------


http://doc.ddart.net/scripting/html/reconintroductiontoregularexpressions.htm

http://www.javascriptkit.com/javatutors/redev2.shtml

http://del.icio.us/kebie/%EC%A0%95%EA%B7%9C%EC%8B%9D

 

 

 

CSS Hack에 대한 사설

http://www.javascriptkit.com/dhtmltutors/csshacks.shtml

 



--------------------------------------------------------------------------------------

 

1. 만들기

1)
    var re=/pattern/flags;

2)
    var re=new RegExp("pattern","flags");

3) 차이 - new로 만들때에는 이스케이프문자는 \\는 \\\\로 해주어야 한다.
    var re=/\\w/;
    var re=new RegExp("\\\\w");


2. 플래그(flag)

  • g (Global 찾기) 패턴에 맞는 모든문자 찾기
  • i (Ignore Case) 대소문자 무시
  • m (Multiline) 여러줄

3.

  • ^ 문자열의 시작을 의미 ,m 플래그를 사용할경우 경우는 각 문자열의 시작
  • $ 문자열의 끝을 의미 ,m 플래그를 사용할경우 경우는 각 문자열의 끝
  • . 모든 한문자

4.

  •     [문자들]  - 괄호안의 문자 하나와 매치
            예) [abc] 는 a나 b나 c중 하나를 의미

  •     [^문자들] - 괄호안의 문자가 아닌문자와 매치
            예) [^abc] 는 1,2.... d,e.... 등과 매치

  •     [문자1-문자2] - 문자1과 문자2와 그 사이의 값과 매치
           예) [a-d] a,b,c,d와 매치    

5. (abc) abc와 매치

6.
|

   
좌우 패턴중 하나를 의미
        예) (abc|def) abc나 def를 의미

7. *, +, ?
        *  앞의 패턴이 0회 또는 그 이상반복됨
        +  앞의 패턴이 1회 또는 그 이상반복됨
        ?  앞의 패턴이 0또는 1회 반복

8. {n}, {n,}, {n,m} 패턴의 반복회수

    예)
        (abc){1,3} abc가 1에서 3회 반복
        (abc){1} abc가 1회반복
        (abc){,10} abc가 10회 이하 반복



9. 특수문자 (Escapes Character)

\\ 일반문자에 \\을 붙여서 특수한 용도로 사용한다.
\\f 폼피드(?)
\\r 캐리지리턴
\\n 새줄
\\t 일반 탭문자
\\v 세로 탭문자(?)
\\0 NUL널문자
[\\b] 백스페이스
\\s 공백문자
    \\f, \\n, \\r, \\t, \\v, \\u00A0, \\u2028, \\u2029
\\S 공백이아닌문자
\\w 알파벳문자,숫자,_ [a-zA-Z0-9_]
\\W 알파벳문자,숫자,_가 아닌문자 [^a-zA-Z0-9_]).
\\d 정수(short for [0-9]).
\\D 정수가 아닌 문자 (short for [^0-9]).
\\b 단어의 경계 공백,새줄.
\\B 경계가 아닌문자.
\\cX 컨트롤+문자 E.g: \\cm matches control-M.
\\xhh 핵사코드
\\uhhhh 유니코드

 

 

 

예)
<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"를 나타냄)
[\\?\\[\\\\\\]] ('?', '[', '\\', ']' 중 하나)

정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함

 

 

 

-----------------------------------------------------------------------------------------------

 

 

 

문자 설명
\\ 그 다음 문자를 특수 문자, 리터럴, 역참조, 또는 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} mn은 음이 아닌 정수입니다. 여기서 mn보다 크거나 같습니다. 최소 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 단어의 경계, 즉 단어와 공백 사이의 위치를 찾습니다. 예를 들어, "er\\b"는 "never"의 "er"는 찾지만 "verb"의 "er"는 찾지 않습니다.
\\B 단어의 비경계를 찾습니다. "er\\B"는 "verb"의 "er"는 찾지만 "never"의 "er"는 찾지 않습니다.
\\cx 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 공백, 탭, 폼피드 등의 공백을 찾습니다. "[ \\f\\n\\r\\t\\v]"와 같습니다.
\\S 공백이 아닌 문자를 찾습니다. "[^ \\f\\n\\r\\t\\v]"와 같습니다.
\\t 탭 문자를 찾습니다. \\x09와 \\cI와 같습니다.
\\v 수직 탭 문자를 찾습니다. \\x0b와 \\cK와 같습니다.
\\w 밑줄을 포함한 모든 단어 문자를 찾습니다. "[A-Za-z0-9_]"와 같습니다.
\\W 모든 비단어 문자를 찾습니다. "[^A-Za-z0-9_]"와 같습니다.
\\xn 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진수이고 ml이 0에서 7 사이의 8진수면 8진수 이스케이프 값 nml을 찾습니다.
\\un n은 4 자리의 16진수로 표현된 유니코드 문자입니다. 예를 들어, \\u00A9는 저작권 기호(©)를 찾습니다.

 

 

http://msdn.microsoft.com:80/scripting/default.htm

다음 정규식은 그 기능을 제공합니다. JScript의 경우는 다음과 같습니다.

/(\\w+):\\/\\/([^/:]+)(:\\d*)?([^# ]*)/

VBScript의 경우는 다음과 같습니다.

"(\\w+):\\/\\/([^/:]+)(:\\d*)?([^# ]*)"

괄호로 묶은 첫 번째 부분식은 웹 주소의 프로토콜 부분을 캡처하도록 설계되었습니다. 이 부분식은 콜론과 두 개의 슬래시 앞에 오는 단어를 모두 찾습니다. 괄호로 묶은 두 번째 부분식은 주소 중 도메인 주소 부분을 캡처합니다. 이 부분식은 '^', '/' 또는 ':' 문자를 포함하지 않는 문자 시퀀스를 찾습니다. 괄호로 묶은 세 번째 부분식은 웹 사이트 포트 번호가 지정되어 있으면 이를 캡처합니다. 이 부분식은 콜론 다음에 오는 0 이상의 자리 수를 찾습니다. 그리고 마지막으로 괄호로 묶은 네 번째 부분식은 웹 주소로 지정된 경로 및/또는 페이지 정보를 캡처합니다. 이 부분식은 '#' 또는 공백 문자를 제외한 하나 이상의 문자를 찾습니다.

정규식을 위의 URI에 적용하면 부분 검색 문자열에 다음이 포함됩니다.

RegExp.$1은 "http"를 포함합니다.

RegExp.$2는 "msdn.microsoft.com"을 포함합니다.

RegExp.$3은 ":80"을 포함합니다.

RegExp.$4는 "/scripting/default.htm"을 포함합니다.

 

'dev' 카테고리의 다른 글

ejb  (0) 2008.08.05
jms  (0) 2008.08.04
script class  (0) 2008.08.01
정규화  (0) 2008.08.01
jndi  (0) 2008.08.01
Posted by 으랏차
,