使用std::regex_replace从替换模式引用整个匹配
Referring to whole match from replacement pattern using std::regex_replace
下面的代码在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$0ABCDABCD
ENDRESS+HAUSER*ST-DELL!HP||BESTMATCH&&ABCD\ABCD
With IDEOne (c++ 14编译器):
ENDRESS+HAUSER*ST-DELL!HP||BESTMATCH&&ABCDABCD
ENDRESS+HAUSER*ST-DELL!HP||BESTMATCH&&ABCD\ABCD
我们可以看到后面有一个错误:在最后一个"ABCD"之前必须有两个反斜杠,而不是一个
这到底是怎么回事?我写了一个手动解析器,而不是使用std::regex_replace,但我真的想让它在VS2015下工作(以及任何其他理想的IDE),并在选择手动解析解决方案之前做一个基准测试。
VS2015默认编译器不将$0
视为第零反向引用。你需要使用"native" ECMAScript $&
反向引用从替换模式内部引用整个匹配
此外,revo是正确的,为了匹配,您需要将其添加到字符类。
请注意,在VS2015中可以使用原始字符串字面值。最佳实践是使用原始字符串字面值来定义正则表达式模式,因为它们有助于避免过度转义(也称为反斜杠地狱)。
解决方案:
std::cout << std::regex_replace(pszTestString,
std::regex(R"([-+!\"[](){}^~*?:]|&&|||)"), "\$&") << std::endl;
^^ ^^
相关文章:
- C++ 是否可以使用对变量的引用来简化这种嵌套循环模式?
- 工厂模式和单例模式:未定义的引用
- 错误:在 C++ 中实现接口模式时未定义对 typeinfo 的引用
- 为什么将boost::move()的返回值分配给非常数引用在C++0x模式下失败,但在C++03模式下有效
- 为引用计数的智能指针检测内存泄漏的设计模式
- 在域驱动设计中,存储库模式是否维护对对象的引用
- lock_guard始终拥有引用互斥锁的锁定模式是什么意思
- 引用自定义容器的C++观察者模式
- 如何在flex中引用子模式
- C++函数调用后不需要的额外按引用传递参数的模式?
- C++中Observer模式实现中的循环引用
- 设计模式,用于创建对向量中元素的智能引用
- 这感觉有点反模式,有没有更好的方法(C++ - 分配给引用)
- 在函数搜索模式中引用二维数组时出错
- 在Visual Studio调试模式下运行时,c++对象引用已损坏
- 使用std::regex_replace从替换模式引用整个匹配
- 编译复杂的(有很多引用的)ASN模式-证书请求格式(RFC4211)
- 指针引用模式-常用
- 具有抽象基类的工厂模式 - 按引用或按值返回?范围界定和切片问题
- 引用数据类成员访问模式