首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有标准的C++11解决方案来转义单引号?

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

Stack Overflow用户
提问于 2014-10-25 10:32:39
回答 1查看 2.1K关注 0票数 1

我一直在寻找一种解决方案来转义std::string中的单引号,但没有找到一种简洁的方法。

This post给出的解决方案很少像这样:

代码语言:javascript
运行
复制
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&") )

EN

回答 1

Stack Overflow用户

发布于 2014-10-25 11:44:56

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

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

代码语言:javascript
运行
复制
 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?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26558791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档