Wednesday, June 14, 2006
정규식 / 정규표현식 (Regular Expressions; Regex) 이란?
정규식이란, 문자열을 검색/치환/추출할 때 사용하는 일종의 '공식'입니다. 원래는 유닉스에서 사용되었지만 이제는 윈도우용 프로그램에서도 널리 쓰입니다.
가령 도스 프롬프트에서의 와일드카드 Wild Card 를 예로 들어보겠습니다.
dir *.txt 라고 입력하면,
123.txt
ABCD.txt
똠방.txt
똠방ABCD각하.txt
등, 모든 .txt 확장자를 가진 파일들의 목록이 한꺼번에 출력됩니다. 여기서 *표는, '임의의 문자들'을 의미하는 와일드 카드입니다. 물론 와일드카드가, 정규식은 아니지만, 정규식도 이것과 비슷합니다. 물론 훨씬 더 강력한 것입니다.
/나는/
이라는 정규식이 있다면 "나는"이라는 모든 문자열을 찾습니다.
/^나는/
이것은 "나는"으로 시작되는 "나는"이라는 단어를 찾는 것입니다. "나는"이라는 문자열이 문장의 중간에 있거나 끝에 있다면 찾지 않습니다. 왜냐하면 정규식에서, 캐럿(^) 기호는 "문자열의 맨처음"을 의미하기 때문입니다.
/주소$/
위의 정규식을, "주소 좀 알려 주소"라는 문장에 적용하면 앞의 "주소"는 매치되지 않고 뒤의 "주소"만 매치됩니다. 정규식에서 $ 는 문자열의 끝을 의미하기 때문입니다. (행갈이 문자를 의미하지는 않고 그냥 단순히 문자열의 끝부분을 의미함)
/^하하하하$/
이것은 "하하하하"라는 문자열로만 이루어진 행을 매치합니다. 캐럿과 달러 기호가 앞뒤로 있기 때문에, "하하하하"로 시작해야 하고 "하하하하"로 끝나야 합니다. 그런 경우는 그 문장이 "하하하하"로만 이루어진 경우에만 가능하기 때문입니다. "하하하하 ㅎㅎ", "ㅋㅋ 하하하하 안녕" 이런 문장 속의 "하하하하"는 매치되지 않습니다.
이런 식입니다. 그러나 이것은 간단한 예일 뿐이고, 복잡한 정규식은 한없이 복잡합니다.
* 각종 텍스트 에디터에서, 복잡한 문자열을 찾고 치환할 때 정규식을 사용합니다. 울트라에디터는 물론이고 거의 모든 텍스트에디터에서 정규식을 지원하지만, 제가 보기로 정규식을 가장 깔끔하게, 그리고 한글도 완벽하게 지원하는 에디터는 이엠에디터(EmEditor)였습니다.
* 프로그래밍 언어에서 문자열을 검색/치환할 때 사용됩니다. C/C++를 제외한, 사실상 모든 언어에서 정규식을 공식적으로 지원하는데, 역시 최고봉은 펄(Perl)입니다. (C++도, Boost C++ Libraries 를 사용하면 정규식을 쓸 수 있습니다.)
문자열을 다루기 위해서 굳이 수십 수백 줄의 프로그래밍을 하지 않아도, 정규식 1~2줄만 있으면 대부분의 문자열 작업을 해낼 수 있습니다.
* 프로그램마다 정규식 문법에 약간씩 차이가 있어, 호환이 안될 때가 많습니다. 표준 정규식도 있는 것으로 알고 있는데 기능이 미약하여, 현재 사실상의 표준은 펄(Perl)의 정규식입니다. 펄의 그것이 가장 강력합니다.
가령 도스 프롬프트에서의 와일드카드 Wild Card 를 예로 들어보겠습니다.
dir *.txt 라고 입력하면,
123.txt
ABCD.txt
똠방.txt
똠방ABCD각하.txt
등, 모든 .txt 확장자를 가진 파일들의 목록이 한꺼번에 출력됩니다. 여기서 *표는, '임의의 문자들'을 의미하는 와일드 카드입니다. 물론 와일드카드가, 정규식은 아니지만, 정규식도 이것과 비슷합니다. 물론 훨씬 더 강력한 것입니다.
가장 기초적인 예제
/나는/
이라는 정규식이 있다면 "나는"이라는 모든 문자열을 찾습니다.
/^나는/
이것은 "나는"으로 시작되는 "나는"이라는 단어를 찾는 것입니다. "나는"이라는 문자열이 문장의 중간에 있거나 끝에 있다면 찾지 않습니다. 왜냐하면 정규식에서, 캐럿(^) 기호는 "문자열의 맨처음"을 의미하기 때문입니다.
/주소$/
위의 정규식을, "주소 좀 알려 주소"라는 문장에 적용하면 앞의 "주소"는 매치되지 않고 뒤의 "주소"만 매치됩니다. 정규식에서 $ 는 문자열의 끝을 의미하기 때문입니다. (행갈이 문자를 의미하지는 않고 그냥 단순히 문자열의 끝부분을 의미함)
/^하하하하$/
이것은 "하하하하"라는 문자열로만 이루어진 행을 매치합니다. 캐럿과 달러 기호가 앞뒤로 있기 때문에, "하하하하"로 시작해야 하고 "하하하하"로 끝나야 합니다. 그런 경우는 그 문장이 "하하하하"로만 이루어진 경우에만 가능하기 때문입니다. "하하하하 ㅎㅎ", "ㅋㅋ 하하하하 안녕" 이런 문장 속의 "하하하하"는 매치되지 않습니다.
이런 식입니다. 그러나 이것은 간단한 예일 뿐이고, 복잡한 정규식은 한없이 복잡합니다.
정규식을 사용할 수 있는 프로그램
* 각종 텍스트 에디터에서, 복잡한 문자열을 찾고 치환할 때 정규식을 사용합니다. 울트라에디터는 물론이고 거의 모든 텍스트에디터에서 정규식을 지원하지만, 제가 보기로 정규식을 가장 깔끔하게, 그리고 한글도 완벽하게 지원하는 에디터는 이엠에디터(EmEditor)였습니다.
* 프로그래밍 언어에서 문자열을 검색/치환할 때 사용됩니다. C/C++를 제외한, 사실상 모든 언어에서 정규식을 공식적으로 지원하는데, 역시 최고봉은 펄(Perl)입니다. (C++도, Boost C++ Libraries 를 사용하면 정규식을 쓸 수 있습니다.)
장점
문자열을 다루기 위해서 굳이 수십 수백 줄의 프로그래밍을 하지 않아도, 정규식 1~2줄만 있으면 대부분의 문자열 작업을 해낼 수 있습니다.
단점
* 프로그램마다 정규식 문법에 약간씩 차이가 있어, 호환이 안될 때가 많습니다. 표준 정규식도 있는 것으로 알고 있는데 기능이 미약하여, 현재 사실상의 표준은 펄(Perl)의 정규식입니다. 펄의 그것이 가장 강력합니다.
tag: regex
정규식 | 정규표현식 | Regex | Regular Expression
tag: editor
텍스트 에디터 | 문서 편집기 | Text Editor
tag: perl
Perl | 펄
유니코드 인코딩이라서
똠방도 표현이 되더군요.
완성형에서는 똠방이 되지 않고
'확장 완성형'에서는 되었는데
'확장 완성형'이란 게 문제가 많은 인코딩이라서 논란이 많습니다.
(∩_∩)
랄라라님의 코멘트:
* 똠방각하라는 단어를 보니 예전에 한글 완성형에서 표현되지 않았던 게 기억납니다..
조합형에서만 표시되었던 것 같은데... ㅎㅎ
(새 블로거 버전에서는, 랄라라님의 한글 아이디 글자가 깨져서, 다시 올립니다.)
<< Home