我正在尝试直接在正则表达式中使用捕获的组。但是,当我尝试这样做时,程序无限期地挂起。
例如:
string input = "<Tag>blahblah</Tag>";
regex r1("<([a-zA-Z]+)>[a-z]+</\1>");
string result = regex_replace(result, regex, "");
如果我向捕获"<([a-zA-Z]+)>[a-z]</\\1>"
添加另一个斜杠,程序将编译但抛出“regex_error(regex_constants :: error_backref)”异常。
备注:
编译器:Apple LLVM 5.1
我正在使用它作为从文本块清除垃圾的过程的一部分。该文档不一定是HTML / XML,并且所需的文本并不总是在标签内。因此,如果可能的话,我希望能够使用正则表达式而不是解析器来执行此操作。
答案 0 :(得分:0)
字符串文字中的反斜杠字符是转义字符。
要么转义"<([a-zA-Z]+)>[a-z]+</\\1>"
,要么使用原始文字R"(<([a-zA-Z]+)>[a-z]+</\1>)"
有了这个,你的程序就像你期望的那样工作:
#include <regex>
#include <iostream>
int main()
{
std::string input = "Hello<Tag>blahblah</Tag> World";
std::regex r1("<([a-zA-Z]+)>[a-z]+</\\1>");
std::string result = regex_replace(input, r1, "");
std::cout << "The result is '" << result << "'\n";
}
演示:http://coliru.stacked-crooked.com/a/ae20b09d46f975e9
您使用\\1
获得的异常表明您的编译器已配置为使用GNU libstdc ++,其中未实现正则表达式。查看如何设置它以使用LLVM libc ++或使用boost.regex。