본문 바로가기

웹프로그램

정규표현식 문법


Url Rewriter를 활용할려고 보니 정규표현식을 알아야 제대로 활용할 수 있겠더군요.

예전부터 정규표현식을 정리하려고 했었는데 이번기회에 하게 되네요. ㅋㅋ

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

Basic Syntax of Regular Expressions (정규표현식의 기본 문법)

먼저 특수문자 '^'와 '$'를 살펴봅시다. 이 문자의 역할은 문자열의 시작과 끝을 의미합니다. 다음과 같은 해당 예를 들 수 있습니다.

 ^The  "The"로 시작하는 문자열
 of despair$  "of despair"로 끝나는 문자열
 ^abc$  "abc"로 시작하고 "abc"로 끝나는 문자열 ("abc" 라는 문자열도 해당됨)
 notice  "notice"가 들어 있는 문자열

마지막 예제에서 보듯이 이 두 개의 특수문자가 없는 패턴은 검사대상이 되는 문자열에 어떤 위치에서든지 들어 있음 의미합니다.

특수문자로는 '*', '+', '?'도 있습니다. 이 문자들은 어떤 문자의 반복에 관한 지정을 해주는 문자입니다. 각각 '0또는 그 이상', '1또는 그 이상', '0또는 1'을 의미합니다. 여기에 몇 가지 예제가 있습니다.

 ab*  a뒤에 0 이상의 b가 있는 문자열 ("a", "ab", "abbb", 등)
 ab+  위와 동일 하지만 최소한 하나 이상의 b가 있어야 함 ("ab", "abbb", 등)
 ab?  b가 하나 있을 수도 있고 없을 수도 있음 (ab 또는 a)
 a?b+$  a가 있을 수도 있고 없을 수도 있으며 그뒤에 하나 이상의 b로 끝나는 문자열

{ }를 사용하면 반복되는 수를 영역으로 지정할 수 있습니다.

 ab{2}  a뒤에 2개의 b가 있는 문자열 ("abb")
 ab{2,}  a뒤에 최소한 2개 이상의 b가 있는 문자열 ("abb", "abbbb", 등)
 ab{3,5}  a뒤에 3개에서 5개 사이의 b가 있는 문자열 ("abbb", "abbbb", 또는 "abbbbb")

{ }를 사용할 때는 반드시 첫 번째 숫자는 적어야 됨을 유의합니다. (i.e, "{0,2}", Not "{,2}"). 또한 '*', '+', '?'는 각각 "{0,}", "{1,}", "{0,1}"와 같습니다.

이제 ()를 사용해서 하나의 문자가 아닌 여러 문자를 지정하는 방법을 알아봅니다.

 a(bc)*  a 뒤에 "bc"가 0또는 그이상의 수만큼 있는 문자열
 a(bc){1,5}  a 뒤에 "bc."가 1에서 5번 들어 있는 문자열

또 다른 특수문자로는 OR 연산을 하는 '|'를 들 수 있습니다.

 hi|hello  "hi"나 "hello"가 들어 있는 문자열
 (b|cd)ef  bef" 또는 "cdef"
 (a|b)*c  a와 b가 섞여서 여러번 나타나고 그뒤에 c가 붙어있는 패턴

'.' (period)는 어떤 한 문자를 의미합니다.

 a.[0-9]  a뒤에 한 문자와 숫자가 붙어 있는 패턴
 ^.{3}$  3문자로만 되어 있는 문자열

[]표현은 문자열의 해당 위치에 사용될 수 있는 문자를 표현하는데 사용합니다.

 [ab]  a또는 b ("a|b"와 동일한 표현)
 [a-d]  소문자 'a'에서 'd'까지 ("a|b|c|d"또는 "[abcd]"와 동일)
 ^[a-zA-Z]  영문자로 시작하는 문자열
 [0-9]%  % 문자 앞에 하나의 숫자가 붙어 있는 패턴
 ,[a-zA-Z0-9]$  영문자, 숫자로 끝나는 문자열 패턴

[]에서 '^'를 표현의 가장 처음에 사용하면 나타나서는 안 되는 문자를 지정할 수 있습니다.
(예> "%[^a-zA-Z]%" 두 % 사이에 영문자가 없는 패턴)

"^.[$()|*+?{"같은 특수 문자는 백슬레쉬('')를 사용해서 escape될 수 있습니다.
( 역자 주 : escape 이란 다른 말로 literal로 탈출한다라고 할 수 있습니다 즉 특수문자로 인식되지 않고 일반 문자로 인식되게 합니다)
사용하는 관점에서 보면 백슬레쉬도 PHP3의 문자열에서 escape되어야 하기 때문에 예를 들어 "($|?[0-9]+"같은 정규표현식은 ereg("($|?[0-9]+", $str) 와 같이 사용됩니다 (이 표현식은 무얼 검사하는 걸까요? ^^;(이건 역자가 한 말이 아닙니다))

하지만 []안에서는 특수문자가 모두 효력을 읽게 되기 때문에 이 법칙을 벗어남을 기억하세요 []안에서는 백슬레쉬를 포함한 모든 특수문자들이 그 힘을 잃습니다 (예> "[*+?{}.]"는 말그대로 '*', '', '+', '?', '{', '}', '.' 문자를 의미합니다. 그리고 regex man 페이지에 나오듯이 ']'문자 자체를 포함하려면 문자들 리스트의 첫 번째에 위치시킵니다('^'가 있으면 '^'뒤에). '-'를 포함하려면 첫 번째 또는 마지막 문자로 지정하고 '-'문자가 영역의 경계 (예> a에서 -까지)일 경우 영역지정 문자의 두 번째 경계로 지정([a--])합니다.

 검색 + 치환을 위한 하부식(부분식)
 ( )둘러싼 부분은 각각 하나의 덩어리로 취급해서,
 검색시 ( ) 안에 해당되는 내용들을 변경할 내용에서 그대로 가져다 이용할 수 있습니다.
 검색된 각각의 ( )안에 해당되는 내용은 변경할 내용에서 $1, $2, .. 등으로 지정해서 쓸 수 있습니다.
 예제) mp3파일 이름 바꾸기
 검색 : (.*) - (.*)\.mp3 .*은 길이에 상관없이 임의의 문자열, \.은 점
 치환 : $2 - $1.mp3 앞에서 검색한 ( )안에 해당되는 내용끼리 순서 바꾸기
 ex) "제목 - 연주자.mp3" Þ "연주자 - 제목.mp3"



[출처] http://blog.naver.com/rosekingdom/60001377686,
          http://xpg.in/totalcmd/forum/viewtopic.php?t=329&highlight=%C1%A4%B1%D4%C7%A5%C7%F6