2016-05-13 53 views
0
std::regex r("((.)(.))(.)"); 

在三個字母的字符串上運行此操作將僅返回5個匹配項。 Coliru如何從正則表達式檢索匹配層次結構

相反,我想檢索兩個「頂層」匹配,其中第一個匹配包含兩個子匹配。我希望能夠將它們嵌套到任何深度並檢索合適的匹配樹。

看起來好像增強有這樣的事情與"nested matches"。它是否正確?我可以在沒有提升的情況下在C++ 11中執行此操作嗎?

額外:一個幾乎沒有價值的玩具例子,這可能是有用的:

((,[0-9]+)+)((,[a-z])+) 

這將匹配的一系列數字,一系列的話,全部用逗號隔開以下。我想將單詞匹配與單詞匹配分開,而不是有一系列平坦的匹配。

+0

用於什麼?你相信你能用這樣的設施做什麼,你不能沒有? –

+0

@IgorTandetnik,我剛剛添加了一個稍微複雜的例子來激勵這個 –

+3

你似乎相信你會得到一個單獨的匹配組的每個重複。這不是'std :: regex'的工作方式。你會得到和正則表達式中打開的對數一樣多的匹配,再加上一對。換句話說,返回的匹配數量由表達式的語法來確定,並且不依賴於匹配的輸入。 –

回答

0

有關正則表達式的一點是它們不是遞歸下降解析器。但是,您可以使用正則表達式和C++(或其他語言,真的)的組合。

剛一說明,也有一些問題,這個表達式:

((,[0-9]+)+)((,[a-z])+) 

爲了不要錯過匹配的第一個項目,該列表必須以,開始。另一個問題是,你也只會捕獲小寫1個字母的單詞。

爲了簡單起見,我將通過假定每個字符串前綴,來解決第一個問題。第二個問題可以通過改變正則表達式來解決:

((,[0-9]+)+)((,[a-zA-Z]+)+) 

注意這不會捕獲一組以上的數字,然後一組字的。正如評論所說,爲此你必須循環搜索。

現在,這是固定的,我可以解釋你將如何去完成你想要的。

所有的數字匹配都在matches[1]。所有的字母匹配都在matches[3]

您可以通過拆分,來獲取數字列表中的每個單獨項目。字母列表也是如此。

+0

在這種情況下,'match [2]'是否與'matches [1]'相同?和'匹配[4]'與'匹配[5]'相同'? –

+0

@AaronMcDaid沒有,'比賽[2]'只會認爲匹配的最後一個迭代。 '匹配[4]'相同'。但沒有'match [5]'(計算左括號的數目)。 – Laurel

+0

對不起,我的意思是'3'而不是'5'!無論如何,我現在明白謝謝。這最後一場比賽被捕獲的事實是潛在的非常有用 - 它允許自動方式重複地移動個人比賽 –