貪欲な量指定子を使用しないことをお勧めしますが、その代わりに、すべての繰り返しを区切り文字と相互に排他的にすることをお勧めします。これは何を意味するのでしょうか?これは、たとえば、A
以外の任意の文字を指定できることを意味します(
。この正規表現を与える:
;([^(]*)[(]([^,]*),([^,]*),([^)]*)[)]
最後[)]
は必要ありません。
PHP コードは次のようになります。
preg_match_all('/;([^(]*)[(]([^,]*),([^,]*),([^)]*)[)]/', $input, $matches);
$fullMatches = $matches[0];
$arrayOfAs = $matches[1];
$arrayOfBs = $matches[2];
$arrayOfCs = $matches[3];
$arrayOfDs = $matches[4];
コメントが示すように、私のエスケープ テクニックは好みの問題です。もちろん、この正規表現は次と同じです。
;([^(]*)\(([^,]*),([^,]*),([^)]*)\)
しかし、それは他のバリアントよりもはるかにミスマッチ/アンバランスに見えると思います. 選んでください!
最後に、貪欲でない (怠惰な) 量指定子を使用するよりも、このアプローチの方が優れている理由について質問します。ここに、いくつかの良い一般的な読み物があります。基本的に、貪欲でない量指定子を使用すると、エンジンはバックトラックする必要があります。(
最初に 1 回の繰り返しを試み、その後一致しないことに気付きます。そのため、繰り返しに戻って別の文字を消費する必要があります。しかし、(
それでも一致しないので、もう一度繰り返しに戻ります。ただし、このアプローチでは、エンジンは最初に繰り返しに入るときに、可能な限り多くの電力を消費します。そして、すべての非(
文字が消費されると、エンジンは(
すぐに次のものを照合できるようになります。