TR1을 이용한 C++에서의 정규식 사용
2009. 6. 30. 20:48 |
Programming
C++을 사용하다 보면 다른 언어의 라이브러리들이 부러운 경우가 많이 있다.
정규표현식은 그 중 하나였는데, 다행히도 VS2008 SP1 이상을 쓰고 있다면 TR1이 내장되어 있어 다른 어떤 써드파티 라이브러리를 연결하지 않고도 #include <regex> 한 줄만 추가해줌으로써 쉽게 사용할 수 있게 되었다.
다음은 원하는 문자열을 매치해서 결과를 받아보는 간단한 예제이다.
const std::string s("Hello World"); std::tr1::smatch m; std::tr1::regex rx("(\\w+) (\\w+)"); bool fMatched = std::tr1::regex_match( s, m, rx ); if ( fMatched ) { std::cout << "size : " << m.size() << std::endl << "match0 : " << m[0] << std::endl << "match1 : " << m[1] << std::endl << "match2 : " << m[2] << std::endl; }
size : 3
match0 : Hello World
match1 : Hello
match2 : World
match0 : Hello World
match1 : Hello
match2 : World
match 객체의 첫번째 요소에는 매치된 모든 문자열이 담기게 되고, 그 다음 요소들 부터는 캡쳐한(괄호로 둘러싼) 문자열들이 저장된다. 위 예제에서는 첫번째 단어와 두번째 단어를 캡쳐해봤다. -물론 캡쳐 없는 괄호 (?: )을 사용해서 캡쳐 기능을 제거할 수도 있다.
파이썬이나 C# 등의 다른 정규식 라이브러리에서도 대부분 위와 흡사한 인터페이스를 제공한다.
다음 코드는 문자열을 치환한다.
const std::string s("Hello World"); std::tr1::regex rx("^\\w+"); std::string t = std::tr1::regex_replace( s, rx, std::string("Great") ); std::cout << t << std::endl;
위 코드는 첫 번째 단어를 "Great" 라는 문자열로 치환시킨다.
치환할 때 백레퍼런스도 역시 사용이 가능하다.
첫번째 캡쳐그룹을 치환시에 재사용 하였다.
간단하게 설명하기 위해서 예제의 실용 가치가 없어져 버렸지만, 잘 응용하면 많은 곳에 적용할 수 있을 것이다.
예전에 이메일 검증 함수를 골뱅이와 .을 찾아가면서 CString의 Find 함수로 떡칠을 하면서 만든적이 있었는데, 시간이 지나고 어느 날 RFC 문서에서 이메일 형식 명세를 보다가 아 내가 엉터리로 만들었구나 하고 깨달았던 기억이 난다. Email이나 URL 형식 같은 것들은 정규식 없이 검증 함수를 만들기엔 생각보다 훨씬 복잡하다.
다른 언어들보다 사용법이 조금 까다롭고 보기에도 좋지는 않지만, 이 정도만으로도 C++ 프로그래머들은 고마움에 눈물이 날만하다.
C++0x에서는 파이썬의 r""이나 C#의 @"" 같은 raw string 기능도 언어에 포함될 예정인데, 그 때가 되면 조금 더 보기 좋게 정규식을 사용할 수 있을 것이다.
Great World
치환할 때 백레퍼런스도 역시 사용이 가능하다.
std::tr1::regex rx("(^\\w+)");
std::string t = std::tr1::regex_replace( s, rx, std::string("Great $1") );
std::string t = std::tr1::regex_replace( s, rx, std::string("Great $1") );
첫번째 캡쳐그룹을 치환시에 재사용 하였다.
Great Hello World
간단하게 설명하기 위해서 예제의 실용 가치가 없어져 버렸지만, 잘 응용하면 많은 곳에 적용할 수 있을 것이다.
예전에 이메일 검증 함수를 골뱅이와 .을 찾아가면서 CString의 Find 함수로 떡칠을 하면서 만든적이 있었는데, 시간이 지나고 어느 날 RFC 문서에서 이메일 형식 명세를 보다가 아 내가 엉터리로 만들었구나 하고 깨달았던 기억이 난다. Email이나 URL 형식 같은 것들은 정규식 없이 검증 함수를 만들기엔 생각보다 훨씬 복잡하다.
다른 언어들보다 사용법이 조금 까다롭고 보기에도 좋지는 않지만, 이 정도만으로도 C++ 프로그래머들은 고마움에 눈물이 날만하다.
C++0x에서는 파이썬의 r""이나 C#의 @"" 같은 raw string 기능도 언어에 포함될 예정인데, 그 때가 되면 조금 더 보기 좋게 정규식을 사용할 수 있을 것이다.
'Programming' 카테고리의 다른 글
2009년 최고의 프로그래밍 언어, Google의 Go (3) | 2010.01.10 |
---|---|
boost 라이브러리로 커맨드 라인 파싱 쉽게 하기 (1) | 2009.09.12 |
TR1을 이용한 C++에서의 정규식 사용 (3) | 2009.06.30 |
SwingX 1.0 has been released. (1) | 2009.06.19 |
컴퓨터 프로그래머(CPQ) 자바 1급 시험을 보고 (8) | 2008.12.07 |
Python 3.0 Released (5) | 2008.12.04 |
태정님 블로그에서 주로 볼 수 있었던 @_ @ 포스트! ^^;
Reply제법인데 ㅋㅋㅋ regex 때문에 골머리 아퍼~
ReplyAutoCad 쉐리들은 왜케 프로그램을 잘만들어서 귀찮게 하는지..
하하. 정규식 없으면 더 골머리 아플껄.