일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- mysql
- Join
- 강좌
- 단축키
- is_array
- mathemetica
- Java
- 월별 카운트
- SQL
- function
- android studio
- cocos2d-x
- application.mk
- php
- Post
- unalias
- Call
- Avr
- 현재언어
- solution
- halliday
- 하이퍼 터미널
- selectc
- Get
- 점점변하는값
- 0x
- PORTG
- 파일존재
- array
- C++
- Today
- Total
코딩도사의 코드정리
정규식 입문 본문
펄 정규식 문법
다음과 문자셋을 제외하고는 전부 매치 할 수 있다.
문자를 직접적으로 표현할려면 \ 을 붙여줘야 됨.
예) \. \[ \? \^
와일드 카드
하나의 . 으로 표현될 수 있으며 이것은 널문자나 줄바꿈 문자를 제외하고 모든 문자를 매치함.
줄의 시작과 끝
^$
줄의 시작하는 곳을 찾으려면 ^
줄이 끝나는 곳을 찾으려면 $
표현 묶기
만약 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] 와 매치되는것을 제외한 모든 문자와 매치된다.
지금까지 배운것을 어떻게 활용할 수 있을까? 그 응용하는 곳은 자기몫이지만
그래도 어떻게 써야겠다는지 모르는 사람을 위해 간단한 예제를 준비해봤다.
우보동
김동미 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일은 없다. 조건 추가하자.
는 훼이크고 정규식을 작성할 때 이런 식으로 조건을 하나하나씩 추가해가면서 정규식을 작성을 하는것이다.
여기서는 완벽한 주민등록번호 검사 정규식을 만드는게 목적이 아니고 어떻게 정규식을 작성하는지에 대해 글을 쓰는거니까 이쯤에서 그만둔다.
잘못된 점이나 하고 싶은 말 있으면 댓글 부탁드려요.
다음글은 이스케이트 문자와 기타 반복자에 대해서 다룰 예정입니다.
'컴퓨터 이야기 > 정규식' 카테고리의 다른 글
이스케이프 문자와 기타 반복자 (0) | 2010.07.27 |
---|---|
정규식 ( Regular Expression ) 소개 (0) | 2010.06.20 |