재미있는 정규식?

doldori의 이미지

제가 Perl과 함께 정규식을 배우고 있는데요.
정규식 이거 정말 재미있네요. 마치 무슨 퀴즈 문제 같아요.
재미있는 정규식을 알고 계시면 소개 좀 해주세요.

Learning Perl에서는 Matering Regular Expressions라는 책을
보라고 하는데 Perl을 어느 정도 익히고 나면 꼭 봐야겠습니다.

leigh의 이미지

예, 정규식 재미있죠~

Mastering Regular Expressions는 펄을 모를때 보셔도 상관없습니다.

Perl을 주 도구로 쓰긴 하지만, Python, .NET, Java, Vi, Sed, grep 등에서도 정규식을 어떻게 사용하고 차이는 무엇인지 잘 알려주거든요.

그리고 "정규식 완전 해부와 실습" 이라는 제목으로 국내 번역서도 나와있답니다.

...

코퍼스의 이미지

제가 좋아하는 예제 중 하나입니다.
아래 예제는 'perl.or.kr' 사이트에 있는 예제에요.

(천 단위마다 숫자에 , 넣어주기)

while( $cnum =~ s/(\d+)(\d{3})\b/$1,$2/ ) { 1; }

A few Good Man

shlee의 이미지

자세히 보지는 못했지만 이런곳도 있습니다.
http://www.regexlib.com/

greatkgc의 이미지

"정규식 완전 해부와 실습" 번역이 무척 잘 되어 있는 책입니다.
전 한 5장까지 읽고 그 다음을 못 나가고 있습니다. ^^ 3장까지
는 쉬운데 그 뒤서부터는 좀 머리가 아프더군요. 그래도 3 장
까지만 읽어도 vim 에서 정규 표현식을 쓰는데 무리가 없죠!

nachnine의 이미지

(b{2}|^b{2})

정규식이 맞게 됐나 모르겠네요

셰익스피어 햄릿에 나오는 유명할 말입니다 ^^

신승한의 이미지

nachnine wrote:
(b{2}|^b{2})

정규식이 맞게 됐나 모르겠네요

셰익스피어 햄릿에 나오는 유명할 말입니다 ^^

^ 를 NOT 의 의미로 사용 하신거라면 "(",")"가 "[","]"로 바뀌어야 할듯합니다.

[(b{2})|^(b{2})] 가 좀더 근접할듯..

lifthrasiir의 이미지

신승한 wrote:
nachnine wrote:
(b{2}|^b{2})

정규식이 맞게 됐나 모르겠네요

셰익스피어 햄릿에 나오는 유명할 말입니다 ^^

^ 를 NOT 의 의미로 사용 하신거라면 "(",")"가 "[","]"로 바뀌어야 할듯합니다.

[(b{2})|^(b{2})] 가 좀더 근접할듯..

두 분 모두 실수하셨습니다. :) (b{2}|[^b]{2})가 맞습니다.

- 토끼군

ydhoney의 이미지

tokigun wrote:
신승한 wrote:
nachnine wrote:
(b{2}|^b{2})

정규식이 맞게 됐나 모르겠네요

셰익스피어 햄릿에 나오는 유명할 말입니다 ^^

^ 를 NOT 의 의미로 사용 하신거라면 "(",")"가 "[","]"로 바뀌어야 할듯합니다.

[(b{2})|^(b{2})] 가 좀더 근접할듯..

두 분 모두 실수하셨습니다. :) (b{2}|[^b]{2})가 맞습니다.

- 토끼군

역시 토끼군..:)

신승한의 이미지

tokigun wrote:
신승한 wrote:
nachnine wrote:
(b{2}|^b{2})

정규식이 맞게 됐나 모르겠네요

셰익스피어 햄릿에 나오는 유명할 말입니다 ^^

^ 를 NOT 의 의미로 사용 하신거라면 "(",")"가 "[","]"로 바뀌어야 할듯합니다.

[(b{2})|^(b{2})] 가 좀더 근접할듯..

두 분 모두 실수하셨습니다. :) (b{2}|[^b]{2})가 맞습니다.

- 토끼군

실수는 없죠..다만 표현의 차이가 있을뿐입니다..:wink:

% cat test
bb
cc

nachnine 님의 NOT 2B는 움직이지 않습니다.

% grep -E "^b{2}" test  
bb

제것은 움직입니다.

% grep -E "[^(b{2})]" test
cc

토끼군님것도 움직이지요

% grep -E "[^b]{2}" test
cc
lifthrasiir의 이미지

신승한 wrote:
tokigun wrote:
신승한 wrote:
nachnine wrote:
(b{2}|^b{2})

정규식이 맞게 됐나 모르겠네요

셰익스피어 햄릿에 나오는 유명할 말입니다 ^^

^ 를 NOT 의 의미로 사용 하신거라면 "(",")"가 "[","]"로 바뀌어야 할듯합니다.

[(b{2})|^(b{2})] 가 좀더 근접할듯..

두 분 모두 실수하셨습니다. :) (b{2}|[^b]{2})가 맞습니다.

- 토끼군

실수는 없죠..다만 표현의 차이가 있을뿐입니다..:wink:

% cat test
bb
cc

nachnine 님의 NOT 2B는 움직이지 않습니다.

% grep -E "^b{2}" test  
bb

제것은 움직입니다.

% grep -E "[^(b{2})]" test
cc

토끼군님것도 움직이지요

% grep -E "[^b]{2}" test
cc

아마 그 정규표현식은 /bb|[^b]{2}/였던 것으로 기억합니다. b[^b]나 [^b]b는 해당하지 않지요. bc, cb도 함께 넣으셔서 테스트해 보시면 아실 겁니다. :)

(b{2}|^b{2})의 경우 bb가 들어 있는 모든 문자열이 매칭됩니다. (^b{2}는 bb로 시작하는 문자열을 뜻합니다)
[(b{2})|^(b{2})]의 경우, []로 묶인 모든 meta character가 그냥 일반 문자로 인식되기 때문에 b, 2, {, }, |, ^, (, ) 중 하나라도 들어 있는 모든 문자열이 매칭됩니다.
(b{2}|[^b]{2})의 경우 [^b]가 "b가 아닌 문자"를 가리키기 때문에, b 두 개 혹은 b가 아닌 문자 두 개가 연속해서 들어 있는 모든 문자열이 매칭됩니다.

:)

- 토끼군

puzzlet의 이미지

정규식만으로 프로그래밍을 할 수 있는 Regxy라는 프로그래밍 언어가 있습니다.

http://c2.com/cgi/wiki?RegXy

0/^.*$//
a//z9az8az7az6az5az4az3az2az1aza/
b/z([0-9]?)a/x$19x$18x$17x$16x$15x$14x$13x$12x$11x$10/
b?/z([0-9]?)a/b
c/x([0-9][0-9]?)/$1 botles uv beer. $1 botles uv beer on the wall, $1 botles uv beer, Take 1 down and pass it around, /
c?/x([0-9][0-9]?)/c
d/^99 botles uv beer. //
e/, 0 botles uv beer.*$/, No more botles uv beer on the wall./

발발다빠따반반나다발딸발발다빠따따맣발발다뿌
멓터벅더떠벋떠벌더벌벌떠벌떠더법벍떠더벌벌떠