在C ++中直接在表达式中使用正则表达式捕获

时间:2014-09-05 17:25:58

标签: c++ regex

我正在尝试直接在正则表达式中使用捕获的组。但是,当我尝试这样做时,程序无限期地挂起。

例如:

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,并且所需的文本并不总是在标签内。因此,如果可能的话,我希望能够使用正则表达式而不是解析器来执行此操作。

1 个答案:

答案 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。