정 규식을 정확히 정의하려면, automata, regular language, finite state machine 등을 설명해야 합니다. 그냥 일반적으로는 패턴매칭을 위한 언어라고 넘어갈 수 있지만, 정규식으로 matching할 수 없는 패턴도 많고, 왜 정규식에 이런 연산자가 없을까 고민하기 시작하면, 모든 것이 모호해져버립니다.
^ (caret) | 라인의 처음이나 문자열의 처음을 표시 | ^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓) |
$ (dollar) | 라인의 끝이나 문자열의 끝을 표시 | aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓) |
. (period) | 임의의 한 문자를 표시 | ^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓) |
a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참) | ||
[] (bracket) | 문자의 집합이나 범위를 나타냄, 두 문자 사이의 "-"는 범위를 나타냄 | [] 내에서 "^"이 선행되면 not을 나타냄 |
{} (brace) | {} 내의 숫자는 직전의 선행문자가 나타나는 횟수 또는 범위를 나타냄 | a{3} ('a'의 3번 반복인 aaa만 해당됨) |
* (asterisk) | "*" 직전의 선행문자가 0번 또는 여러번 나타나는 문자열 | ab*c ('b'를 0번 또는 여러번 포함하므로 ac, ackdddd, abc, abbc, abbbbbbbc 등) |
+ | "+" 직전의 선행문자가 1번 이상 나타나는 문자열 | ab+c ('b'를 1번 또는 여러번 포함하므로 abc, abckdddd, abbc, abbbbbbbc 등, ac는 안됨) |
? | "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열 | ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨) |
() (parenthesis) | ()는 정규식내에서 패턴을 그룹화 할 때 사용 | |
| (bar) | or를 나타냄 | a|b|c (a, b, c 중 하나, 즉 [a-c] 와 동일함) |
\ (backslash) | 위에서 사용된 특수 문자들을 정규식내에서 문자로 취급하고 싶을 때 '\'를 선행시켜서 사용하면됨 | filename\.ext ("filename.ext"를 나타냄) |
정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함
위 의 정규식 연산자 가운데 vi에서는 지원하지 않는 연산자가 있습니다. vi의 경우 +연산자도 없습니다. regular expression library에 따라 지원하는 연산자의 종류가 상당히 다릅니다. 요즘은 perl-style regular expression이 표준으로 자리잡아가는 것이 대체적인 추세이고, perl의 regular expression은 가장 복합하고 기능이 많은 편입니다.
[abc] | (a, b, c 중 어떤 문자, "[a-c]."과 동일) |
[Yy] | (Y 또는 y) |
[A-Za-z0-9] | (모든 알파벳과 숫자) |
[-A-Z]. | ("-"(hyphen)과 모든 대문자) |
[^a-z] | (소문자 이외의 문자) |
[^0-9] | (숫자 이외의 문자) |
[[:digit:]] | ([0-9]와 동일) |
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 등이 해당) |
* | (선행문자가 없는 경우이므로 임의의 문자열 및 공백 문자열도 해당됨) |
.* | (선행문자가 "."이므로 하나 이상의 문자를 포함하는 문자열, 공백 문자열은 안됨) |
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 등) |
ab+ | ('b'를 1번 또는 여러번 포함하므로 ab, abccc, abb, abbbbbbb 등) |
like.+ | (직전의 선행문자가 '.'이므로 like에 하나 이상의 문자가 추가된 문자열이 됨, likely, liker, likelihood 등, 그러나 like는 해당안됨) |
[A-Z]+ | (대문자로만 이루어진 문자열) |
yes|Yes | (yes나 Yes 중 하나, [yY]es와 동일함) |
korea|japan|chinese | (korea, japan, chinese 중 하나) |
[\?\[\\\]] | ('?', '[', '\', ']' 중 하나) |
한글이름 정규식 : [\uac00-\ud7a3]{2,4}