gpt4 book ai didi

c++ - 使用 std::regex_replace 从替换模式引用整个匹配

转载 作者:行者123 更新时间:2023-11-30 05:22:26 26 4
gpt4 key购买 nike

下面的代码在 Visual Studio 2015 和 IDEOne.com (C++14) 中不会给出相同的结果。更奇怪的是,这两种情况的结果都不正确!

#include <iostream>
#include <regex>

int main()
{
const char* pszTestString = "ENDRESS+HAUSER*ST-DELL!HP||BESTMATCH&&ABCD\\ABCD";
const char* pszExpectedString = "ENDRESS\\+HAUSER\\*ST\\-DELL\\!HP\\||BESTMATCH\\&&ABCD\\\\ABCD";
std::cout << std::regex_replace(pszTestString, std::regex("[-+!\"\\[\\](){}^~*?:]|&&|\\|\\|"), "\\$0") << std::endl;
std::cout << pszExpectedString << std::endl;

return 0;
}

在 Visual Studio 2015 下我得到了这个奇怪的结果,第二行包含两个编译器的预期结果:

ENDRESS\$0HAUSER\$0ST\$0DELL\$0HP\$0BESTMATCH\$0ABCD\ABCD
ENDRESS\+HAUSER\*ST\-DELL\!HP\||BESTMATCH\&&ABCD\\ABCD

使用 IDEOne(C++14 编译器):

ENDRESS\+HAUSER\*ST\-DELL\!HP\||BESTMATCH\&&ABCD\ABCD
ENDRESS\+HAUSER\*ST\-DELL\!HP\||BESTMATCH\&&ABCD\\ABCD

我们可以看到后者有一个错误:在最后一个“ABCD”之前必须有两个反斜杠,而不是一个

这到底是怎么回事?我编写了一个手动解析器,而不是暂时使用 std::regex_replace,但我真的想让它在 VS2015(理想情况下是任何其他 IDE)下工作,并在选择手动解析解决方案之前进行基准测试。

最佳答案

VS2015 默认编译器不会将 $0 视为第零个反向引用。 您需要使用 "native" ECMAScript $& backreference从替换模式中引用整个匹配项。

此外,revo is right , 为了匹配 \ 你需要把它添加到字符类中。

请注意,在 VS2015 中,您可以使用原始字符串文字。最佳做法是使用原始字符串文字来定义正则表达式模式,因为它们有助于避免过度转义(也称为 backslash hell)。

解决方法:

std::cout << std::regex_replace(pszTestString, 
std::regex(R"([-+!\\\"\[\](){}^~*?:]|&&|\|\|)"), "\\$&") << std::endl;
^^ ^^

关于c++ - 使用 std::regex_replace 从替换模式引用整个匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39680398/

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