정규식 입문

컴퓨터 이야기/정규식 2010. 6. 21. 16:45

펄 정규식 문법
다음과 문자셋을 제외하고는 전부 매치 할 수 있다.

.[{()\*+?|^$

문자를 직접적으로 표현할려면 \ 을 붙여줘야 됨.
예) \. \[ \? \^


와일드 카드

.

하나의 . 으로 표현될 수 있으며 이것은 널문자나 줄바꿈 문자를 제외하고 모든 문자를 매치함.

줄의 시작과 끝


^$

줄의 시작하는 곳을 찾으려면 ^
줄이 끝나는 곳을 찾으려면 $

표현 묶기

묶기 시작할 곳에서 '(' 그리고 닫는 곳에서 ')'

만약 apple 이란 단어가 여러개 붙어있는 곳을 찾고 싶다면? apple+ 하면 될까?
apple+ 이란 표현은 apple 이란 문자 전체가 반복되는것을 매치하는게 아니고
applee, appleee 와 같은 문자와 매치된다. 만약 우리가 원하는 답을 얻고 싶으면 (apple)+ 이라고 해야 된다.
추가적으로 괄호로 묶인 부분은 back-reference 라고 불리는 놈을 이용하여 재사용될 수 있다.
만약 back-reference 에 포함하기 싫다면 (?:apple)+ 라고 하면 된다.


반복
* 라는 문자는 0개 이상의 문자와 매치한다.
예를 들면 a*b 와 매치되는 문장은
b
ab
aab
aaab

+ 라는 문자는 1개 이상의 문자와 매치한다.
예를 들면 a+b 와 매치되는 문장은
ab
aab
aaaaab

? 라는 문자는 0개 혹은 1개 문자와 매치한다.
예를 들면 ca?b 와 매치되는 문장은
cb
cab
딱 두개다.

a{n} 은 a 가 n 개 반복된다는 뜻이다.
예를 들면 a{5} 와 매치되는 문장은
aaaaa

a{n,} 는 n 개 이상의 a 와 매치된다.
예를들면 a{4,}
aaaa
aaaaa
aaaaaaa

a{n, m} 은 n 번반복과 m번 반복의 사이를 찾아준다.
a{3,5}
aaa
aaaa
aaaaa

이것 혹은 저것
abc|def 는
abc 혹은 def 를 찾아 준다.
그룹으로 묶어줄 수도 있다. ab(d|ef) 는 abd 와 abef 를 찾아 준다.

문자셋
예를 들어 [abc] 는 a 혹은 b 혹은 c 와 매치된다.
주의할 점은 [(ab)c] 같은 문법은 ( 자체가 문자로 인식되어버려 (, a, b, ), c 와 매치된다는 점이다.

문자범위 지정
[a-c] 는 a 부터 c 까지를 뜻한다. 즉 [abc] 와 동일 효과를 지닌다.
그렇다고 해서 쓸모 없는것은 아니다. [a-z] 까지 찾는것을 쓸 때 [abcdef...z] 라고 쓸 순 없겠지.

문자범위 부정
[^a-c] 는 [abc] 와 매치되는것을 제외한 모든 문자와 매치된다.


지금까지 배운것을 어떻게 활용할 수 있을까? 그 응용하는 곳은 자기몫이지만
그래도 어떻게 써야겠다는지 모르는 사람을 위해 간단한 예제를 준비해봤다.

한성수 880502-1165489
우보동
김동미 890245-1234589
돈만동
박재귀 880421-2648712
소시동
정사효 900123-1423475
충덕동
류만삭 880411-2146789
뉴욕
김대규 890915-1654131
부대동
신구민 911102-1213599
덕니동
김환타 881225-1225122
변대동
......


 라는 목록이 있다고 치자. 여기서 주민등록번호만 검색하고 싶으면 아래와 같이 작성하면 된다.
[0-9]{6}-[0-9]{7}

생각외로 쉽게 끝났다. 그런데 보자...
어라? 월, 일은 숫자의 범위가 제한되어야 한다. 조건을 추가해보자.
[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])-[0-9]{7}
왼쪽 부분만 고쳤더니 오른쪽 부분도 사실상 맨 앞자리는 1,2,3,4 4개의 숫자만 들어올 수 있다.
오른쪽 부분만 고쳐보자
[0-9]{7} 에서 (1|2|3|4)[0-9]{6}

생각해보니 2월30일은 없다. 조건 추가하자.






는 훼이크고 정규식을 작성할 때 이런 식으로 조건을 하나하나씩 추가해가면서 정규식을 작성을 하는것이다.

여기서는 완벽한 주민등록번호 검사 정규식을 만드는게 목적이 아니고 어떻게 정규식을 작성하는지에 대해 글을 쓰는거니까 이쯤에서 그만둔다.

잘못된 점이나 하고 싶은 말 있으면 댓글 부탁드려요.


다음글은 이스케이트 문자와 기타 반복자에 대해서 다룰 예정입니다.

: