gpt4 book ai didi

c++ - std::regex 转义在正则表达式中使用的特殊字符

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:24 32 4
gpt4 key购买 nike

我正在创建一个 std::regex(__FILE__) 作为单元测试的一部分,该单元测试检查一些打印文件名的异常输出。

在 Windows 上它失败了:

regex_error(error_escape): The expression contained an invalid escaped character, or a trailing 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 的定义上降低一定程度的转义,这是对正则表达式版本的可读性胜利。

关于c++ - std::regex 转义在正则表达式中使用的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39228912/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com