c++ - 是否有标准的 C++11 解决方案来转义单引号?

标签 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&") )

最佳答案

很多人会使用正则表达式来做一些非常简单的事情,比如转义字符串中的一个字符,这给我留下了深刻的印象。您提到了性能,使用正则表达式肯定不会很快,除非您在转换之前要执行相当复杂的测试,或者您的最终用户可以控制转换(即他们必须编写正则表达式。)

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

 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];
     }
 }

这可能会给您带来最佳性能。是的,这不仅仅是一个简单的函数调用......有些人会用 find() 搜索'\'',扫描会非常接近这个扫描,但通常复制一个 substr()比在扫描时复制字符成本更高。

请注意,如果您使用的是 boost,则那里有一个 replace_all() 函数,您也可以使用它。它会更干净,但你没有提到 boost ...... replace_all() (以及其他解决方案)有一​​个答案:

How to find and replace string?

关于c++ - 是否有标准的 C++11 解决方案来转义单引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26558791/

相关文章:

c++ - 在 C++ 11 线程中通过引用传递;变化是本地化的

c++ - 为什么 ADL 优先于 'std namespace' 中的函数,但等于用户定义的命名空间中的函数?

带有正则表达式的 JavaScript 表单验证邮寄地址不起作用!

java - Java 中 nonProxyHosts 属性的有效正则表达式格式是什么?

javascript - 正则表达式来测试箭头功能

c++ - 构造函数采用初始化列表

C++ 反向 regex_search

c++ - 如何为模板类使用 friend 关键字

c++ - DirectX11 发布 VS 2010 C++

c++ - 调试断言失败 : invalid iterators