我會建議你不要使用一個不真實的量詞,而是讓所有的重複與他們的分隔符互斥。這是什麼意思?這意味着,例如,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.基本上,當你使用不確定的量詞時,引擎仍然需要回溯。它先嚐試一次重複,然後注意(
之後不匹配。所以它必須重新進入重複並消耗另一個角色。但(
仍然不匹配,所以再次回到重複。然而,採用這種方法,首次進入重複時,發動機將盡可能多地消耗。並且當所有非(
字符被消耗時,則引擎將立即能夠匹配以下(
。
因此它總是隻有3個元素在圓括號內? –
是的,總是3個元素 – skyline26
它是如何與貪婪? – zerkms