Я не знаю, что это самый умный или самый эффективный, но я использую что-то вроде следующего:
namespace {
bool
isMeta( char ch )
{
static bool const meta[UCHAR_MAX] =
{
// ...
};
return meta[static_cast<unsigned char>( ch )];
}
std::string
sanitizeForRegEx( std::string const& original )
{
std::string result;
for ( std::string::const_iterator iter = original.begin();
iter != original.end();
++ iter ) {
if ( isMeta( *iter ) ) {
result += '\\';
result += *iter;
}
return result;
}
Для wchar_t
я бы изменил isMeta
, чтобы вернуть что-то вроде:
return ch >= 0 && ch < 128 && meta[ ch ];
Инициализация meta
немного скучна, и точные значения зависят от используемых регулярных выражений (или даже параметров, если используется boost::regex
).