我一直在寻找一种解决方案来转义 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()
(以及其他解决方案)有一个答案:
关于c++ - 是否有标准的 C++11 解决方案来转义单引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26558791/