我一直在寻找一种解决方案来转义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&") )
发布于 2014-10-25 11:44:56
给我留下深刻印象的是,很多人会使用正则表达式给出答案,做一些非常简单的事情,比如转义字符串中的一个字符。你提到了性能,使用正则表达式肯定不会很快,除非你在转换之前有一个相当复杂的测试要执行,或者如果你的最终用户控制了转换(即他们必须编写正则表达式)。
坦率地说,在这种情况下,你应该用一个简单的循环来编写它:
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()
(以及其他解决方案)给出了一个答案:
https://stackoverflow.com/questions/26558791
复制相似问题