次のコードはなぜですか:
<?php echo preg_replace("/(.*)/", "$1.def", "abc");
?abc.def.def
の代わりに出力abc.def
繰り返しが発生する理由を理解することに興味があります。
/(.+)/
orを使用/^(.*)$/
すると期待どおりに動作しますが、私は解決策を探しているわけではなく、質問をしているだけです (ただし、これらのパターンは答えに関連している可能性があります)。
ここでライブバージョンをいじります。
次のコードはなぜですか:
<?php echo preg_replace("/(.*)/", "$1.def", "abc");
?abc.def.def
の代わりに出力abc.def
繰り返しが発生する理由を理解することに興味があります。
/(.+)/
orを使用/^(.*)$/
すると期待どおりに動作しますが、私は解決策を探しているわけではなく、質問をしているだけです (ただし、これらのパターンは答えに関連している可能性があります)。
ここでライブバージョンをいじります。
.*
文字列の末尾にある空の部分文字列に一致するためです。これは、string に 2 つの一致があることを意味しますabc
。
abc
→abc.def
.def
を与えabc.def.def
ます。
編集:それが起こる理由の詳細は、String.replaceAll() anomaly with greedy quantifiers in regex で説明されています。
これは予想される動作です: https://bugs.php.net/bug.php?id=53855
これは予期された動作であり、PHP に特有のものではありません。* 量指定子を使用すると、件名文字列の末尾に「空の」一致が発生します。
正規表現を欲張りで/(.*?)/
ないものにすると、繰り返しのプロセス全体がはるかに大きく/目立つスケールで機能することがわかります。
.defa.defb.defc.def
a、b、c、の4つの一致が得られますempty
。一方、他の人が述べたように、貪欲な正規表現を使用すると、完全な文字列と空の文字列の2つの一致が得られます。