'컴퓨터 이야기/정규식'에 해당되는 글 3건

  1. 2010.07.27 이스케이프 문자와 기타 반복자
  2. 2010.06.21 정규식 입문 1
  3. 2010.06.20 정규식 ( Regular Expression ) 소개

이스케이프 문자와 기타 반복자

컴퓨터 이야기/정규식 2010. 7. 27. 05:40
Non Greedy repeats

기본적으로 정규식은 greedy 방법을 사용한다. greedy 방법은 가능한한 최대의 입력을 취급한다는 이야기다.
non-greedy 방법은 가능한한 최소의 입력을 받는다.

abcdaXbcdabcdX 와 같은 문자가 있으면
(a.+X).* 로 매치했을 때 abcdaXbcdabcdX 가 매치되지만
아래와 같은
(a.+?X).* 같은 표현으로 매치하면 abcdaX 가 매치된다.
*?
+?

{n,}?

{n,m}?

이까지는 이해가 가는데

?? 라는 표현도 있음.

예를 들어 표현하면

a??c 를 했을 때

abc444ac 라는게 있다면 abc 를 찾는게 아니고 ac 를 찾음

가능한한 짧은걸 찾음.

 

Back references

std::string s("apple banana");
 std::tr1::regex rg("(.+) (.+)");
 s = std::tr1::regex_replace(s,rg,std::string("$2 $1"));
 cout << s << endl;

결과값 : banana apple
매치하면서 썼던 문자집합을 $n 와 같은 표현으로 사용가능.


 

이스케이프 문자 

같은 표현

\d

[0-9]

\l

소문자

\s

모든공백문자

\u

대문자

\w

대소문자와 밑줄을 포함하는 모든 영숫자 [a-zA-Z0-9_] 와 같음

\h

\v

수직 탭

\D

[^0-9] 와 같음

\L

소문자를 제외한 것

\S

공백이 아닌 문자

\U

대문자를 제외한것

\W

[^a-zA-Z0-9_] 와 같음

\H

수평탭을 제외한 것

\V

수직탭을 제외한 것


 

'컴퓨터 이야기 > 정규식' 카테고리의 다른 글

정규식 입문  (1) 2010.06.21
정규식 ( Regular Expression ) 소개  (0) 2010.06.20
:

정규식 입문

컴퓨터 이야기/정규식 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일은 없다. 조건 추가하자.






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

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

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


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

:

정규식 ( Regular Expression ) 소개

컴퓨터 이야기/정규식 2010. 6. 20. 14:42

정규 표현식(正規表現式, Regular expression에서 줄여서 Regexp 또는 Regex)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 Tcl은 언어 자체에 강력한 정규 표현식 구현을 내장하고 있다.

정규 표현식은 컴퓨터 과학의 정규 언어로부터 유래하였으나 구현체에 따라서 정규 언어보다 더 넓은 언어를 표현할 수 있는 경우도 있으며, 심지어 정규 표현식 자체의 문법도 여러 가지 존재하고 있다. 이 중 표준화된 것으로는 POSIX의 확장 정규 표현식이 있으며, 표준화되지는 않았지만 펄의 정규 표현식과 그 대체 구현인 PCRE도 널리 사용된다.


정규식의 종류는 JGsoft/.NET/Java/Perl/PCRE/ECMA/Python/Ruby/Tcl ARE/POSIX BRE/POSIX ERE/GNU BRE/GNU ERE 정도가 있는데, 여기서는 사실상 표준처럼 널리 쓰이는 Perl 정규표현식 위주로 글을 쓰겠습니다. 비록 표준은 아니지만 C++ 0x TR1 라이브러리에서도 POSIX BRE/ERE 보다는 Perl Regular Expressions 를 기본값으로 쓰고 있거든요.

정규식을 활용하면 문서내에 숫자를 찾는것도 쉽게 할 수 있고 특정 토큰으로 분리되어있는 문서도 쉽게 뽑아올 수 있습니다.

예를 들어 숫자를 찾고 싶다면
"[-+]?([0-9]+\.[0-9]+|[0-9]+)"

라고 쓰는거죠. 위 식은 "+3.3" "-1.2" "3.5" "03.32" "-52.44" "34" "33" "+3" "-5" 등의 숫자와 전부 매치가 됩니다.

만약에 누가 어떤 문서를 주면서 "이 문서 안에 있는 모든 숫자를 가져와" 같은 업무가 발생한다면

당신은 어떻게 하겠습니까? 몇KB안되는 텍스트 문서라면 일일이 찾을 수 있겠죠. 하지만 그 분량이 많아지면 그 작업은 정말 피곤하고 영양가 없는 작업이 될겁니다. 사람이 직접 한다고 해도 그 작업의 정확성은 보장할 수 없기도 하고요.

이러한 작업을 엄청나게 간단하게 컴퓨터한테 시킬 수 있는 강력한 도구가 정규표현식입니다.
컴퓨터가 할 수 있는 일은 컴퓨터한테 시켜야되지 않겠어요?

'컴퓨터 이야기 > 정규식' 카테고리의 다른 글

이스케이프 문자와 기타 반복자  (0) 2010.07.27
정규식 입문  (1) 2010.06.21
: