비주얼 스튜디오 2008 SP1에서 정규표현식을 사용하기 위한 방법은 2가지가 있다.
 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("[바|보") );
위와 같이 런타임 에러가 발생하는 이유는 정규표현식 문자열을 내부적으로 컴파일할때 표현식이 올바르지 않으면 Throw 예외를 발생시키기 때문이다. 이를 막기 위한 코드는 아래와 같다.
 
#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가 외부에 존재한다면 얼마나 좋을까 하는 아쉬움이 남는다.
2010/05/09 19:53 2010/05/09 19:53

덧글을 달아 주세요