2016년 3월 15일 화요일

정규표현식 문법 기초

본 포스트는 다음의 pdf 파일을 참고(번역)해서 작성했습니다.
http://www.lunametrics.com/regex-book/Regular-Expressions-Google-Analytics.pdf


백슬래시(backslash) \

정규표현식을 배울 때 가장 먼저 시작하면 좋은 것은 백슬래시(\) 입니다. 백슬래시는 정규표현식과 일반 텍스트를 구분해주는 역할을 합니다. 백슬래시 다음에 오는 문자는 정규표현식이 아닌 일반 캐릭터로 인식을 합니다.

예를 들면 /folder?pid=123 이라는 글자를 가져오려고 할 때 '?'는 어떻게 찾아야 할까요? ?는 정규표현식에서 이미 예약하여 사용하는 표현입니다. 이럴 때
/folder\?pid=123
처럼 사용합니다. 여기서 백슬래시는 ?앞에 사용되어서 ?가 정규표현식의 일부가 아니라 일반 캐릭터라는 것을 알려줍니다.


파이프(pipe) |

파이프는 or를 의미합니다.
Coke|Pepsi
처럼 사용할 수 있습니다.


물음표(question mark) ?

물음표는 마지막 캐릭터는 optional이다. 라는 의미입니다.
Robb?in 을 검색하면 Robin과 Robbin 둘 다 찾아줍니다. 마지막 b는 optional 이니까요.


괄호(parentheses) ()

정규표현식에서 괄호는 수학에서의 괄호와 똑같이 사용됩니다.
/folder(one|two)/thanks
는 /folderone/thanks와 /foldertwo/thanks 모두 찾아줍니다.
위에서 언급된 ?와 함께 사용하여 다음과 같은 정규표현식을 작성할 수 있습니다.
/thanks(alot)?
만약 /thanks, /thankyou, thanksalot 세 개의 폴더가 있다면 thankyou는 검색되지 않을 것 입니다.


큰괄호(square brackets) [] 와 다시(dashes) -

큰괄호와 다시는 뗄래야 뗄 수 없는 관계입니다. 먼저 큰 괄호만 사용하면 간단한 리스트를 만드는 의미가 있습니다.
p[aiu]n
이라는 정규표현식을 사용하면 pan, pin, pun은 검색이 되지만 pain은 검색되지 않습니다.

또한 다시를 사용하여 조금 더 긴 리스트를 만들 수 있습니다.
[a-z]는 모든 영어 소문자 알파벳을 의미합니다.
[A-Z]는 모든 영어 대문자 알파벳을 의미합니다.
[a-zA-Z0-9]는 모든 영어 소문자, 대문자 알파벳과 0~9 사이의 숫자를 의미합니다.

활용 예를 하나 더 들면, sneakers401, sneakers408, sneakers101 등의 문자들이 있을 때 이 중 sneakers401과 sneakers408만 뽑고 싶다면 다음과 같이 작성하면 된다.
sneakers40[0-8]


중괄호(braces) {}

중괄호는 반복 횟수를 나타냅니다. 중괄호 안에는 {x, y} 처럼 두 개의 숫자나 {z} 처럼 한 개의 숫자가 들어올 수 있습니다. 두 개의 숫자가 있을 때에는 마지막 캐릭터를 최소 x번 최대 y번 반복하는걸 의미합니다. 숫자가 한개만 있을 때에는 정확히 z번 반복하는 것을 의미합니다.

예를 들어 123.145.167.0 과 123.145.167.99 두 개의 아이피를 찾고 싶다면 다음과 같이 작성할 수 있습니다.
123\.145\.167\.[0-9]{1,2}


점(dot) .
점은 단 하나의 캐릭터를 매치합니다. 단 하나의 캐릭터란 공백을 포함한 모든 종류의 캐릭터를 의미합니다. 점 자체로는 큰 쓸모가 없지만 다른 정규식과 결합하여 강력한 힘을 발휘합니다.
.ite
는 site, lite, bite, kite 를 모두 찾아줍니다. $ite %ite 같은 것들도 물론이구요. 하지만 ite를 찾지는 않습니다. ite앞에 캐릭터가 존재하지 않기 때문입니다.
?? 위에서는 공백도 찾아준다고 했는데.. 확인해봐야 할 듯..


더하기(plus sign) +
더하기 표시는 하나 혹은 그 이상의 캐릭터가 반복되는 것을 의미합니다.
aa+rgh
라는 정규식은 aargh, aaaaargh 모두 찾아줍니다. 단 argh는 찾지 않습니다. +는 하나 혹은 그 이상을 의미하니까요.


곱하기(star) *
곱하기 표시는 제로 혹은 그 이상의 아이템을 의미합니다. 더하기 표시와 거의 흡사하지만 캐릭터가 없어도 찾아준다는 부분이 다릅니다.
aa*rgh
는 aa+rgh가 찾는 모든 것을 찾아주고 추가로 argh도 찾습니다. *는 0개도 포함하니까요.


점 별(dot star) .*

모든것을 찾아라, 라는 의미의 정규식이 존재합니다. 
/folderone/.*index\.php
위의 예제에서 정규식은 folderone/ 로 시작하고 index.php 로 끝나는 모든 값들을 찾습니다. 


꺽쇄(caret) ^

정규식에서 꺽쇄를 사용하면 정규식에서 지정한대로 정확하게 시작하는 부분만 찾는것을 의미합니다.
^/subfolder2/index\.html
이라는 정규식을 작성하였다면, 문자열은 반드시 /subfolder 로 시작하여야 합니다. 만약 문자열이 /folder1/subfolder2/index.html 이라면, 절대 찾아지지 않을 것입니다.


달러 표시(dollar sign) $

달러 표시의 의미는 문자열에서 내 정규식의 $표시 뒤에 추가적인 문자열이 존재한다면 찾지 않겠다는 뜻입니다. 위에서 언급한 꺽쇄와 같이 사용한다면 다음과 같은 정규식을 작성할 수 있습니다.
^/$
이는 /mysite.com/folder/ 처럼 /로 시작하고 /로 끝나는 문자열만 매치하겠다는 의미입니다.



댓글 없음:

댓글 쓰기