perl은 다른 언어에서는 찾아보기 힘든 매우 강력한 정규표현식을 제공한다. 물론 PHP(:12)와 Python도 정규표현식을 제공하긴 하지만, perl에서의 정규표현식이 역사도 오래되었고 거의 표준이다 보니 고무신에 양복을 입힌 느낌이랄까 그런 느낌이 드는 경우가 있다. 그래서 정규표현식을 이용해야 할 경우에는 여전히 Perl을 사용한다.
C/C++은 어떡해야 하나. 주력언어가 C/C++이다 보니, C언에서도 사용할 수 있는 정규표현도구가 있으면 하는게 바램이었다. regex가 있긴 하지만, Perl의 강력함에 비하면 사용하기가 여간 불편한게 아니다. 특히 perl의 치환 능력을 생각하면..
그러다가 구글신에 물어물어 PCRE라는 정규표현라이브러리를 찾게 되었다. 무려 Perl Compatible Regular Expressions이란다. 내가 원하는게 이것 아닐까 라는 생각이 들었다. 알아 봤더니 Apache, PHP, KDE, Postfix, Nmap, Analog등 이미 많은 프로그램에서 사용되는 라이브러리 였다. 나만 모르고 있었군 T.T
PCRECPP
PCRECPP는 PCRE의 C++ wrapper 함수로 구글에서 제공한다. 어느 라이브러리를 사용해도 관계 없겠으나. wrapper인 만큼 치환등 좀 더 광범위한 기능을 지원하고 있어서 PCRECPP를 정규표현/치환 라이브러리로 사용하기로 했다.
참고로 이 라이브러리는 사용방법을 익히는게 중요한게 아니다. 펄 정규표현을 이해하는게 중요하다.
// 완전 일치 하므로 1을 반환한다.
pcrecpp::RE re("h.*o");
cout << re.FullMatch("hello") << endl;
// 부분 일치하므로 0을 반환한다.
pcrecpp::RE re("e");
cout << re.FullMatch("hello") << endl;
문자열은 const char *와 string 모두 사용할 수 있다.
매칭된 문자열을 따로 저장할 수도 있다. 문자열 "ruby:1234"이 있고, ruby와 1234를 따로 저장하길 원한다면, 다음과 같이 하면 된다. 이걸 regex나 포인터를 이용해서 작업할 것을 생각해보면, 꽤나 끔찍할 것 같다.
int i;
string s;
pcrecpp::RE re("(\\w+):(\\d+)");
re.FullMatch("ruby:1234", &s, &i);
cout << s << " " << i << endl;
Contents
PCRE
PCRECPP
설치
인클루드
컴파일
풀 매칭
부분 매칭
정규표현식 규칙 수정
Scanning Text Incrementally
문자열 치환
예제
약간의 문제
Recent Posts
Archive Posts
Tags