자바스크립트뿐만 아니라 다른 언어의 정규식 표현들은 항상 잊어 버리기 싶단 말이지...
항상 할때 마다 생각이 나지 않아서 정리해 본다.
-------------------------------------------------------------------------------
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. 만들기
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} | 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 | 단어의 경계, 즉 단어와 공백 사이의 위치를 찾습니다. 예를 들어, "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진수이고 m과 l이 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"을 포함합니다.