1. std::tr1::regex, std::tr1::wregex 를 활용한 방법
2. boost의 regex를 사용하는 방법
우선 여기에선 정규표현식을 사용하기 전에 정규표현식 자체의 문법이 올바르지 않을때 발생하는
문제점에 대해서 알아보기로 한다.
#include < iostream > #include < regex > int _tmain(int argc, _TCHAR* argv[]) { setlocale( LC_ALL, "Korean" ); std::wstring strBadWord( _T("이런 바보 같은 놈들") ); std::tr1::wregex regularExpression( _T("바보") ); std::wstring strResult; strResult = std::tr1::regex_replace( strBadWord, regularExpression, std::wstring( _T("") ) ); std::wcout << strResult << std::endl; return 0; }위 예제의 결과 "바보"가 "" 빈 문자열로 대체되고, "이런 같은 놈들" 문자열만 남게 된다.
여기에서 "바보" 대신에 정규표현식 문자열을 대체하여 사용 가능하다.
정규표현식에 대한 자세한 정보는 검색엔진에서 더욱 훌륭한 설명을 얻을 수 있기 때문에,
실제로 잘못된 정규표현식을 넣으면 어떻게 되는지 살펴보기로 한다.
std::tr1::wregex regularExpression( _T("[바|보]") );위의 표현식은 "바" 또는 "보" 글자 중 하나가 있는지 살펴보는 정규표현식이다. 위 표현식에서 "[" 로 열고 "]"를 닫지 않은 표현식을 사용하면 런타임 에러가 발생한다.
std::tr1::wregex regularExpression( _T("[바|보") );
#include < iostream > #include < regex > int _tmain(int argc, _TCHAR* argv[]) { setlocale( LC_ALL, "Korean" ); std::wstring strBadWord( _T("이런 바보 같은 놈들") ); std::tr1::wregex regularExpression; try { regularExpression.assign( _T("[바|보") ); } catch (std::tr1::regex_error e ) { std::wcout << e.what() << std::endl; return 0; } std::wstring strResult; strResult = std::tr1::regex_replace( strBadWord, regularExpression, std::wstring( _T("") ) ); std::wcout << strResult << std::endl; return 0; }이처럼 try, catch문을 사용하여 정규표현식 에러에 대한 예외처리를 해야만 한다.
try, catch문 사용이 부담되는 프로그래머 입장에서 볼 때,
정규표현식이 올바른지 검사하는 API가 외부에 존재한다면 얼마나 좋을까 하는 아쉬움이 남는다.
덧글을 달아 주세요