gpt4 book ai didi

c++ - std::regex_replace 给了我意想不到的结果

转载 作者:可可西里 更新时间:2023-11-01 10:07:23 25 4
gpt4 key购买 nike

我在 C++ Windows 项目 (Visual Studio 2010) 中使用 std::regex_replace。代码如下所示:

std::string str("http://www.wikipedia.org/");
std::regex fromRegex("http://([^@:/]+\\.)?wik(ipedia|imedia)\\.org/", std::regex_constants::icase);
std::string fmt("https://$1wik$2.org/");
std::string result = std::regex_replace(str, fromRegex, fmt);

我希望 result"https://www.wikipedia.org/",但我得到 "https://www.wikipedia .wikipedia.org/".

使用 sed 快速检查得到了预期的结果

$ cat > test.txt
http://www.wikipedia.org/
$ sed 's/http:\/\/([^@:\/]+\.)?wik(ipedia|imedia)\.org\//https:\/\/$1wik$2.org\//' test.txt
http://www.wikipedia.org/

我不明白差异从何而来。我检查了可以与 std::regex_replace 一起使用的标志,但没有看到对这种情况有帮助的标志。

更新

这些变体工作正常:

std::regex fromRegex("http://([^@:/]+\\.)wik(ipedia|imedia)\\.org/", std::regex_constants::icase);
std::regex fromRegex("http://((?:[^@:/]+\\.)?)wik(ipedia|imedia)\\.org/", std::regex_constants::icase);
std::regex fromRegex("http://([a-z]+\\.)?wik(ipedia|imedia)\\.org/", std::regex_constants::icase);
std::regex fromRegex("http://([^a]+\\.)?wik(ipedia|imedia)\\.org/", std::regex_constants::icase);

但不是这些:

std::regex fromRegex("http://([^1-9]+\\.)?wik(ipedia|imedia)\\.org/", std::regex_constants::icase);
std::regex fromRegex("http://([^@]+\\.)?wik(ipedia|imedia)\\.org/", std::regex_constants::icase);
std::regex fromRegex("http://([^:]+\\.)?wik(ipedia|imedia)\\.org/", std::regex_constants::icase);

这对我来说毫无意义......

最佳答案

正则表达式中有一个细微的错误。不要忘记字符串文字中的转义序列由编译器扩展。所以改变

"http://([^@:/]+\.)?wik(ipedia|imedia)\.org/"

"http://([^@:/]+\\.)?wik(ipedia|imedia)\\.org/"

也就是说,将两个单反斜杠中的每一个替换为一对反斜杠。

编辑:不过,这似乎不会影响问题。在我尝试过的两个实现(Microsoft 和 clang)中,没有出现原来的问题,我们没有使用双反斜杠。 (否则,您会收到有关无效转义序列的编译器警告,但生成的 . 通配符与目标序列中的 . 字符匹配,就像 \. 会)

关于c++ - std::regex_replace 给了我意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13978080/

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