정규표현식
출처: 이승혁,「PHP웹프로그래밍가이드」(서울:마이트Press) 2000, pp. 178-182.
정규표현식의 규칙
문자열 패턴을 표현하기 위해 정규 표현식 함수와 함께 사용되는 특수 문자들이 있다. 정규 표현식에 사용되는 이 특수 문자들의 사용법을 먼저 알아보도록 하자
패턴 표현에 사용되는 특수 문자
정규 표현식에서 패턴을 표현하기 위해 사용하는 특수 문자와 규칙은 다음과 같다.
- '.' 특수문자
'.'은 어떤 문자이건 간에 임의의 한 글자를 나타낸다. 예를 들면, 패턴 a.c는 어느 한 문자의 앞 문자가 a이고 뒷 문자는 c인 모든 문자열을 포함한다. 따라서 aac나 abc, acc는 이 패턴에 일치되는 문자열이다. 그러나 .은 반드시 임의의 한 글자만을 대신하기 때문에 a로 시작해 c로 끝나는 문자열 중 두 글자뿐인 ac나 abbc는 이 패턴에 포함되지 않는다.
| 사용예 | 내용 | 해당 문자열 |
| s.e | s와 e사이에 임의의 한 글자를 갖는 문자열과 일치한다. | sae, sbe, sce, sde, … |
| .ce | ce 앞에 임의의 한 글자를 갖는 문자열과 일치한다. | ace, kce, fce, … |
- '*' 특수문자
'*'는 바로 앞의 문자를 의미하며 그 문자가 없거나 하나 이상임을 나타낸다. 위의 '.'이 그 자체로 임의의 한 글자만을 의미하는 데 반해 '*'는 바로 복수 개의 문자를 나타낼 수 있다. 대신 '*' 앞에는 반드시 문자가 하나 이상 있어야 한다. 만일 "*e"와 같이 '*' 앞에 문자가 없으면 잘못된 패턴으로 인식해 에러가 발생한다.
| 사용예 | 내용 | 해당 문자열 |
| s*e | e 앞에 s가 없거나 하나 이상 존재하는 모든 문자열을 나타낸다. | e, se, sse, ssse, … |
| abc* | ab 다음에 c가 없거나 하나 이상 존재하는 모든 문자열을 나타낸다. | ab, abc, abcc, abccc, … |
| h*im | im 앞에 h가 없거나 하나 이상 존재하는 모든 문자열을 나타낸다. | im, him, hhim, hhhim, … |
- '+' 특수문자
'+'는 바로 앞의 문자를 의미하여 그 문자가 하나 이상임을 나타낸다. '*'와 마찬가지로 앞에 한 문자가 있어야 하며 이 문자가 최소 하나 이상 존재하는 모든 문자열을 포함한다.
| 사용예 | 내용 | 해당 문자열 |
| s+e | 문자 e앞에 s가 최소한 하나 이상 존재하는 모든 문자열을 나타낸다. | se, sse, ssse, sssse, settle, … |
- '?' 특수문자
'?'는 바로 앞의 문자가 없거나 혹은 있음을 나타낸다. 예를 들면, s?e는 '?' 앞의 문자 s가 없거나 하나 존재하는 문자열 e나 se를 포함한다.
| 사용예 | 내용 | 해당 문자열 |
| th?e | t와 e사이에 h가 하나 있거나 혹은 없는 문자열과 일치한다. | te, the, their, lotte, … |
- '^' 특수문자
'^'는 바로 뒤의 문자열을 기준으로 이것과 동일한 문자열로 시작되는 것을 가리킨다.
| 사용예 | 내용 | 해당 문자열 |
| ^The | The로 시작하는 모든 문자열을 나타낸다. | The girl is beautiful!, Theater, … |
| ^a?bc | bc나 abc로 시작하는 모든 문자열을 나타낸다. | bc++ 3.0, abcdef), … |
| ^.e | e 앞에 한 글자가 존재하는 문자열로 시작하는 모든 문자열을 나타낸다. | he, me, request, settle, … |
| ^s.e? | s와 임의의 한 문자로 시작하고 그 뒤에 문자 e가 하나 있거나 혹은 없는 문자열을 나타낸다. | sa, sae, sb, sbe, … |
- '$' 특수문자
'$'는 문자열의 맨 마지막을 가리킨다.
| 사용예 | 내용 | 해당 문자열 |
| a?bc$ | bc로 끝나는 문자열 앞에 문자 a가 없거나 하나 존재하는 문자열과 일치한다. | eeabc, seebc, bc, … |
| t.e$ | t와 임의의 한 글자, 그리고 그 다음에 e로 연결되어 끝나는 문자열과 일치한다. | onthetoe, bctae, appetitte, … |
| s?e+$ | 첫 글자는 s나 e로 시작하고 하나 이상의 e로 끝나는 문자열과 일치한다. | e, se, ee, eee, see, seee, … |
| ^the$ | the로 시작해서 the로 끝나는 문자열과 일치한다. 즉, 이 경우는 문자열 자체가 the뿐인 경우에만 일치한다. | the |
- '[]' 특수문자
각괄호 []는 [] 안에 있는 문자열 중에서 하나의 문자만을 의미한다. [] 안에서 범위를 지정할 때는 '-' 문자를 사용한다. 즉, [a-d]는 [abcd]와 동일하며 [0-9]는 [0123456789]와 같은 의미이다.
| 사용예 | 내용 | 해당 문자열 |
| [ab]cd | acd 또는 bcd를 포함하는 문자열과 일치한다. | acd, tacde, "bcd", "tbcde", … |
| ^[ab]cd | acd 또는 bcd로 시작하는 문자열과 일치한다. | acds, bcdt, acdsee32, … |
| [a-z] | 영문 소문자 한 글자를 포함하는 문자열과 일치한다. | a0c2ds, ta123cde, Student, … |
| [a-zA-Z] | 영문 소문자나 대문자 한 글자를 포함하는 문자열과 일치한다. | LINUX, 386AT, … |
| [0-9] | 십진수 한 자를 포함하는 문자열과 일치한다. | a0c2ds, ta123cde, 386, … |
| ga[a-z] | 하나의 영문 소문자 앞에 ge를 갖는 문자열과 일치한다. | LINgazUX, gazzett, … |
| ^ab[ce]ef | abcef 또는 abdef로 시작하는 문자열과 일치한다. | abcef0z, abdef386, … |
| ^[a-zA-Z] | 영문자로 시작하는 모든 문자열과 일치한다. | LINgazUX, abcef0z, … |
| [a-z]+ | 영문소문자 한 자 이상을 갖는 문자열과 일치한다. | tgabcabcef, MySQL, … |
| [aA][bB] | ab, aB, Ab, AB를 포함하는 문자열과 일치한다. | 386ABIT, abcef0z, tgabcabcef, … |
| ,[a-zA-Z0-9]$ | 콤마와 하나의 영문자 또는 숫자로 끝나는 문자열과 일치한다. | abdef38,6, 199,2, … |
만일 원하지 않는 문자를 제외한 나머지 문자를 가리킬 때에는 []안의 첫 문자로 '^'를 사용한다.
| 사용예 | 내용 | 해당 문자열 |
| [^ab]cd | acd와 bcd를 제외하고는 패턴 .cd와 같다. 즉, cd앞에 a나 b를 제외한 하나의 문자를 포함하는 문자열과 일치한다. | ccd, scd, 018cd, tgcdcdabcef, gazcd18, … |
| s[^ab]t | sat와 sbt를 제외하고는 패턴 s.t와 같다. 즉, t 앞에 a나 b를 제외한 임의의 한 문자와 그 앞에 s가 있는 문자열과 일치한다. | sct, sdt, tgcdsctda28, settle, … |
| [^a-z] | 영문 소문자를 제외한 한 글자를 포함한 문자열과 일치한다. | MySQL, 386sAB,IT, abcef0z, 199,2, … |
| [^a-zA-Z] | 영문자를 제외한 한 글자를 포함하는 문자열과 일치한다. | 286sAB,IT, gazscd18, abcef0z, 199,2, … |
| [^0-9] | 숫자를 제외한 한 글자를 포함하는 문자열과 일치한다. | settle, gazscd18, LINUX, … |
- '{}' 특수문자
중괄호 {}는 {} 앞에 있는 문자나 문자열의 개수를 결정한다.
| 사용예 | 내용 | 해당 문자열 |
| a{2}b | aab를 가진 문자열과 일치한다. 즉, {2}는 {}앞에 있는 문자 a의 개수가 2개임을 의미한다. | aab, … |
| a{2,}b | a의 개수가 최소한 2개 이상인 문자열을 포함하는 문자열과 일치한다. | aab, aaab, aaaab, … |
| a{1,3}b | b앞에 1개부터 3개까지의 a를 갖는 문자열을 포함하는 문자열과 일치한다. | ab, aab, aaab, … |
- '()' 특수문자
둥근괄호 ()는 () 앞에 있는 글자들을 그룹화 한다.
| 사용예 | 내용 | 해당 문자열 |
| a(bc){2} | a뒤에 bc의 개수가 두 개인 문자열 abcbc를 포함하는 모든 문자열과 일치한다. [bc]가 b 또는 c중 하나를 의미하는 것에 비해 (bc)는 bc를 하나의 그룹으로 처리한다. | docabcbctor, tabcbc++, … |
| a(bc)* | a뒤에 bc가 없거나 하나 이상인 문자열과 일치한다. | sea, abcd, abcbcbcbc, … |
- '|' 특수문자
'|'는 OR 연산자이다.
| 사용예 | 내용 | 해당 문자열 |
| he|she | he나 she를 포함하는 문자열과 일치한다. | he is handsome, she's gone, … |
| (he|she)is | is 앞에 he나 she를 포함하는 문자열, 즉 heis나 sheis를 포함하는 모든 문자열과 일치한다. | |
| (le|li)*ft | ft 앞에 le나 li가 없거나 하나 이상인 문자열과 일치한다. | mlefto, lft, lelift, fclelelilefte, … |
| mo(no)+ | mo뒤에 no가 하나 이상인 문자열과 일치한다. | mono, monono, mononono, acmonoe, … |
문자 클래스(character class)
패턴을 [a-z]나 [A-Z], [0-9]로 표현하는 대신 다음과 같이 문자 클래스(character class)로 간단하게 표현할 수도 있다.
- [[:alpha:]] : 알파벳 문자 중 하나를 의미하며 [a-zA-Z], 또는 [a-Z]와 동일한 표현이다.
- [[:digit:]] : 숫자 한 자를 의미하며 [0-9]와 동일한 표현이다.
- [[:alnum:]] : 알파벳 문자나 숫자 중 하나를 의미하며 [a-zA-Z0-9]와 동일한 표현이다.
- [[:space:]] : 공백 문자 ( )를 의미한다.
정규 표현식에서 특수 문자의 표현
지금까지 정규 표현식에서 사용한 여러 특수 문자를 특수 문자가 아닌 그 문자 자체의 의미로 사용하려면 특수 문자 앞에 역슬래시('\') 문자를 붙여 escape시켜야 한다. 정규 표현식에서 escape시켜야 하는 특수 문자로는 다음과 같은 것들이 있다.
| ^ . [ ] $ ( ) | * + ? { } \ |
- \*+ : 문자 '*'이 하나 이상 포함된 모든 문자열과 일치한다. 이것은 정규 표현식에서 사용하는 특수문자 '*'를 '\*'와 같이 escape시킴으로써 문자열에서 '*'가 포함된 문자열을 찾는다.
예) *notice***, dictsh*eionary
- \[RE:[1-9][0-9]*\] : "["와 "RE:", 그리고 0을 제외한 하나의 숫자와 0 또는 하나 이상의 0을 포함한 숫자, 그리고 "]"를 순서대로 포함하는 모든 문자열과 일치한다. 즉, 이는 게시판에 답장 글을 올릴 때의 "[RE:12]"와 같은 패턴을 의미한다.
예) [RE:9], [RE:21]*eionary
- [*\/+?{}.] : "*"나 "\", "/", "+", "?", "{", "}", "."중 하나를 포함하는 모든 문자열과 일치한다. 특수문자 []안에서는 위의 경우와 달리 예외가 적용된다. 즉, []안에서는 특수 문자를 문자 자체로 표현하기 위해 해당 문자를 별도로 escape시키지 않아도 된다.
예) [RE:21]*eionary, turboc++, ce{le}brity, hello?, ac/monoe
|