2012-11-22 85 views
3

我是爲窮人標題抱歉,但它是一個非常通用的問題我怎麼寫這個正則表達式? ungreedy相關

我要匹配這個模式

;AAAAAAA(BBBBBB,CCCCC,DDDDDD) 
  • AAAAA =從開始的所有字符「;」 (「(」不包括)
  • BBBBB =從「(」到「,」(均不包括)的所有字符
  • CCCCC =從「,」到「 (均,,不包含)
  • DDDDD =從開始的所有字符 「」 到 「)」(二者)不包括)

的 「x和y之間的所有字符」 是殺死的問題我每次

:(

我是我們PHP和我必須匹配所有這種模式(preg_match_all),也可以在多行

謝謝您提前!

+0

因此它總是隻有3個元素在圓括號內? –

+0

是的,總是3個元素 – skyline26

+0

它是如何與貪婪? – zerkms

回答

3

我會建議你不要使用一個不真實的量詞,而是讓所有的重複與他們的分隔符互斥。這是什麼意思?這意味着,例如,A可以是除(之外的任何字符。給這個正則表達式:

;([^(]*)[(]([^,]*),([^,]*),([^)]*)[)] 

其中最後[)]甚至是不必要的。

的PHP代碼會再看看這樣的:

preg_match_all('/;([^(]*)[(]([^,]*),([^,]*),([^)]*)[)]/', $input, $matches); 
$fullMatches = $matches[0]; 
$arrayOfAs = $matches[1]; 
$arrayOfBs = $matches[2]; 
$arrayOfCs = $matches[3]; 
$arrayOfDs = $matches[4]; 

由於意見表明,我的逃避技術是口味的問題。這個正則表達式當然等於:

;([^(]*)\(([^,]*),([^,]*),([^)]*)\) 

但我認爲這看起來比其他變體更多的不匹配/不平衡。帶你去挑選!

最後,對於這個問題,爲什麼這個方法會比使用非理性(懶惰)量詞更好。 Here is some good, general reading.基本上,當你使用不確定的量詞時,引擎仍然需要回溯。它先嚐試一次重複,然後注意(之後不匹配。所以它必須重新進入重複並消耗另一個角色。但(仍然不匹配,所以再次回到重複。然而,採用這種方法,首次進入重複時,發動機將盡可能多地消耗。並且當所有非(字符被消耗時,則引擎將立即能夠匹配以下(

+1

'[(]','[]]'---爲什麼要創建一個字符集? – zerkms

+1

'[(]'比'\('。 – Gumbo

+2

@zerkms轉義更令人困惑。Gumbo,我想這是品味問題 –

1

你可以使用類似這樣的代碼:

preg_match_all('/;(.*?)\((.*?),(.*?),(.*?)\)/s',$text,$matches); 

看到它的ideone.com

基本上,您可以使用.*?(問號不確定),確保轉義括號,並且您可能需要s修飾符才能使其在多行上工作。

變量將在一個數組中:$matches