我要创建一个std::regex(__FILE__)
作为单元测试的一部分的字符串,该单元测试将检查一些异常输出,该异常输出显示文件名。
在Windows上,它失败并显示:
regex_error(error_escape):表达式包含无效的转义字符或尾随转义符。
因为__FILE__
宏扩展包含未转义的反斜杠。
有没有比循环遍历结果字符串(即使用std
算法或某些std::string
函数)更优雅的方式来转义反斜杠?
文件路径可以包含许多在正则表达式模式中具有特殊含义的字符。通常情况下,仅转义反斜杠不足以进行强大的检查。
甚至一个简单的路径(如C:\Program Files (x86)\Vendor\Product\app.exe
)也包含几个特殊字符。如果要将其转换为正则表达式(或正则表达式的一部分),则不仅需要转义反斜杠,还必须转义括号和句点(点)。
幸运的是,我们可以使用更多的正则表达式解决正则表达式问题:
std::string EscapeForRegularExpression(const std::string &s) {
static const std::regex metacharacters(R"([\.\^\$\-\+\(\)\[\]\{\}\|\?\*)");
return std::regex_replace(s, metacharacters, "\\$&");
}
(文件路径不能包含*
或?
,但是我将它们包含在内是为了使该函数具有一般性。)
如果您不遵守“没有原始循环”准则,那么可能更快的实现将避免使用正则表达式:
std::string EscapeForRegularExpression(const std::string &s) {
static const char metacharacters[] = R"(\.^$-+()[]{}|?*)";
std::string out;
out.reserve(s.size());
for (auto ch : s) {
if (std::strchr(metacharacters, ch))
out.push_back('\\');
out.push_back(ch);
}
return out;
}
尽管循环增加了一些混乱,但是这种方法使我们可以降低对的定义的转义metacharacters
,这是对正则表达式版本的可读性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句