gpt4 book ai didi

c++ - std::regex - 前瞻断言并不总是有效

转载 作者:行者123 更新时间:2023-12-04 11:35:13 25 4
gpt4 key购买 nike

我正在编写一个模块,它将一些字符串替换为文本以提供给脚本语言。该语言的语法模糊不清,因此表达式以括号和空格分隔的符号为界,其中大多数以 '$' 开头。像这样的正则表达式似乎应该在适当的符号边界处给出匹配:

auto re_match_abc = std::regex{ "(?=.*[[:space:]()])\\$abc(?=[()[:space:]].*)" };
但是在我的环境中(Visual C++ 2017, 15.9.19,targeting C++-17)它可以匹配前面没有合适边界的字符串:
std::cout << "  $abc   -> " << std::regex_replace(" $abc ", re_match_abc, "***") << std::endl;
std::cout << " ($abc) -> " << std::regex_replace("($abc)", re_match_abc, "***") << std::endl;
std::cout << "xyz$abc -> " << std::regex_replace("xyz$abc ", re_match_abc, "***") << std::endl;
std::cout << " $abcdef -> " << std::regex_replace(" $abcdef", re_match_abc, "***") << std::endl;

// Result from VC++ 2017:
//
// $abc -> ***
// ($abc) -> (***)
// xyz$abc -> xyz*** <= What's going wrong here?
// $abcdef -> $abcdef
为什么那个正则表达式忽略了在匹配文本之前至少有一个空格或括号的积极前瞻要求?
[我意识到还有其他方法可以完成这项工作,并且要真正稳健地完成这项工作,也许我应该使用某些东西将字符串转换为 token 流,但对于我的直接工作(并且因为创作处理的字符串的人坐在我旁边,所以我们可以协调)我认为现在可以使用正则表达式替换。]

最佳答案

您需要使用积极的回顾。你真正想要的是这个:

auto re_match_abc = std::regex{ "(?<=[[:space:]()])\\$abc(?=[()[:space:]])" };
您可以在类似 https://regex101.com/ 的网站上试用。 (只需删除 C++ 字符串所需的转义反斜杠)。它解释了正则表达式的每个部分正在做什么,并向您展示所有匹配的内容。
请记住,这也将匹配 )$abc) 之类的内容。
编辑: std::regex显然不支持后视。对于您的具体情况,您可以尝试这样的事情:
    auto re_match_abc = std::regex{ "([[:space:]()])\\$abc(?=[()[:space:]])" };
std::cout << " $abc -> " << std::regex_replace(" $abc ", re_match_abc, "$1***") << std::endl;
std::cout << " ($abc) -> " << std::regex_replace("($abc)", re_match_abc, "$1***") << std::endl;
std::cout << "xyz$abc -> " << std::regex_replace("xyz$abc ", re_match_abc, "$1***") << std::endl;
std::cout << " $abcdef -> " << std::regex_replace(" $abcdef", re_match_abc, "$1***") << std::endl;
输出:
  $abc   ->  *** 
($abc) -> (***)
xyz$abc -> xyz$abc
$abcdef -> $abcdef
try it here
在这里,我们有一个普通的捕获组,而不是后视。在替换中,我们发出我们捕获的任何内容(括号或空格),然后是我们想要替换的实际字符串 $abc和。

关于c++ - std::regex - 前瞻断言并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67929910/

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