2014-09-05 76 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