是否有标准的C ++ 11解决方案来逃避单引号?

时间:2014-10-25 02:32:39

标签: c++ regex c++11 boost

我一直在寻找一种解决方法来逃避std :: string中的单引号,而没有找到一种干净的方法来执行此操作。

This post提供的解决方案很少:

std::wstring regex_escape(const std::wstring& string_to_escape) {
    static const boost::wregex re_boostRegexEscape( _T("[\\^\\.\\$\\|\\(\\)\\[\\]\\*\\+\\?\\/\\\\]") );
    const std::wstring rep( _T("\\\\\\1&") );
    std::wstring result = regex_replace(string_to_escape, re_boostRegexEscape, rep, boost::match_default | boost::format_sed);
    return result;
}

相当酷,但对我的要求太复杂了。是否有更简单,更易理解(和标准)的方法来解决这个问题(没有达到性能)?

注意:也许我发现上面的内容过于复杂,因为我真的不明白这一行在做什么:const std::wstring rep( _T("\\\\\\1&") )

1 个答案:

答案 0 :(得分:3)

我非常感兴趣的是,有很多人会使用正则表达式做出一些非常简单的回答,例如在字符串中转义一个字符。你提到了性能,使用正则表达式肯定不会很快,除非你在转换之前执行相当复杂的测试或者你的最终用户控制着转换(即他们必须编写正则表达式。)

坦率地说,在这种情况下,你应该用一个简单的循环来编写它:

 std::string result;
 size_t const len(input.length());
 result.reserve(len + 10);  // assume up to 10 single quotes...
 for(size_t idx(0); idx < len; ++idx)
 {
     if(input[idx] == '\'')
     {
          result += "\\\'";
     }
     else
     {
          result += input[idx];
     }
 }

这可能会给您带来最佳表现。是的,它不只是一个简单的函数调用......有些人会搜索&#39; \&#39;&#39;&#39;使用find(),扫描将非常接近此扫描,但复制substr()通常比扫描时复制字符的成本高。

请注意,如果您正在使用boost,那么您可以使用replace_all()函数。它会更干净,但你没有提到提升...... replace_all()(以及其他解决方案)中有一个答案:

How to find and replace string?