2014-09-05 80 views
0

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

例如:

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)” 异常。

注:
编译:苹果LLVM 5.1
我用这作为过程从文本块清理垃圾的一部分。该文档不一定是HTML/XML,所需的文本并不总是在标签内。所以如果可能的话,我希望能够用正则表达式来做到这一点,而不是解析器。

+0

你的正则表达式应该是'<([a-zA-Z]+)> [a-z] +' – 2014-09-05 17:29:10

+0

对不起,在编写问题时加上plus是我的一个疏忽。谢谢你的收获;我编辑了代码。然而,问题的中心更多地集中在使用捕获比正则表达式的其余部分 – user2238231 2014-09-05 17:33:07

+2

它看起来像你试图解析(X)使用正则表达式的HTML。你真的不应该使用正则表达式。 – RevanProdigalKnight 2014-09-05 17:36:47

回答

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。

+0

好吧,我明白了。抛出错误的原因是我回到了“\ 1”。由于\\ 1是正确的,我的问题实际上是抛出的错误。我相信我的编译器已经在使用libC++,因为命令行返回值是“libC++ abi.dylib:terminate called throwing an exception”,然后指向异常。此外,没有捕获的正则表达式使用相同的编译器可以正常工作。 – user2238231 2014-09-05 20:23:41

+0

@ user2238231 libC++ abi与libC++不同。你使用编译器标志'-stdlib = libC++'吗? – Cubbi 2014-09-05 20:38:42