2013-08-07 54 views
2

我希望能夠在一行中捕獲重複組。我做了如下所示的工作;正則表達式:無法找到重複模式

(((?:\s*^>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*(,\s*[a-zA-Z]+\s*)*;$\s*)|(?:\s*^>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*,\s*[0-9]+\s*(,\s*[\-]?[0-9]+\s*)*;$\s*))+) 

Regular expression visualization

Edit live on Debuggex

它捕獲> 9, 2, door, open;> 3, 3, door,1, 1;分別罰款。不過,我也想捕獲> 9, 2, door, close; > 1, 9, door, close; > 3, 3, door, 1, 1;。我最後用+量詞括號括起了我的小組,但它沒有正確捕獲重複模式。你能告訴我我做錯了嗎?

EDITED

我提出的正則表達式稍短如下;

(((\s*>\s*\d+\s*,\s*\d+\s*,\s*\w+\s*(,\s*\w+\s*)*;\s*)|(\s*>\s*\d+\s*,\s*\d+\s*,\s*\w+\s*,\s*\d+\s*(,\s*[\-]?\d+\s*)*;\s*))+) 

Regular expression visualization

回答

2

如果你的意思寫

> 9, 2, door, close; > 1, 9, door, close; > 3, 3, door, 1, 1; 

在同一行,所以你得通過刪除^修復您的正則表達式和$完全如此,這將匹配

(((?:\s*>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*(,\s*[a-zA-Z]+\s*)*;\s*)|(?:\s*>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*,\s*[0-9]+\s*(,\s*[\-]?[0-9]+\s*)*;\s*))+) 

如果你的意思是

> 9, 2, door, close; 
> 1, 9, door, close; 
> 3, 3, door, 1, 1; 

所以每一個是你得到了通過添加多(/m(?m))修改,以解決您的正則表達式,從而將匹配

(?m)(((?:\s*^>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*(,\s*[a-zA-Z]+\s*)*;$\s*)|(?:\s*^>\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[a-zA-Z]+\s*,\s*[0-9]+\s*(,\s*[\-]?[0-9]+\s*)*;$\s*))+) 

希望這能解決您的問題

+1

不要使用'\ w'而不是'[a-zA-Z]',除非你的意思是因爲它取決於你的語言環境,它可能也包含'_'。 – ophidion

+0

你在同一時間發佈了答案,我找出答案。我會接受這個答案,因爲你提供了一些我從未見過的有價值的信息,'\ w' vs'[a-zA-Z]'。 – ikel

0

對不起,你的正則表達式是waaaay太長,我讀......取而代之的是聰明,創建一個較小的正則表達式,如果你願意,你可以只創建一個不同的每種格式都包含一個,並將所有這些包裝在parens中,並將管道放入其中。例如, ((\d+)|([a-zA-Z]+))+

編輯:你似乎正在那樣做。爲了方便起見,重新啓動,並首先單獨編寫每一個。或者,你可以給你的格式的詳細細節,我們可以寫吧:3

+0

由於單獨的一行。格式與上面給出的例子類似。 '> 9,2,門,關門; > 1,9,門,關閉; > 3,3,門,1,1;'請不要爲我寫信,我寧願自己做。謝謝你的提議。 – ikel