私はいくつかの古いコードベースを調べており、意味的に同一であると思う2つの正規表現部分に出くわしました。Stackoverflowコミュニティが私の理解を確認できるのだろうか。
RegEx 1:(。+?)-1つ以上の文字、ただしオプション
正規表現2:(。*)-0文字以上
私はさまざまなシナリオを考え続けていますが、両方の式が同じにならない入力は考えられません。
私はいくつかの古いコードベースを調べており、意味的に同一であると思う2つの正規表現部分に出くわしました。Stackoverflowコミュニティが私の理解を確認できるのだろうか。
RegEx 1:(。+?)-1つ以上の文字、ただしオプション
正規表現2:(。*)-0文字以上
私はさまざまなシナリオを考え続けていますが、両方の式が同じにならない入力は考えられません。
(.+?)1つ以上の文字に一致することを意味しますが、デフォルトの欲張り一致(可能な限り一致)の代わりに、?後の数量詞は一致を怠惰にします(可能な限り一致しません)。
概念的には、欲張りマッチングは、最初に内部のパターンによって形成できる可能な限り長いシーケンスを試行し、次にエンジンがバックトラックするにつれてシーケンスの長さを徐々に減らします。レイジーマッチングは、最初に内部のパターンによって形成できる最短のシーケンスを試行し、次にエンジンがバックトラックするにつれてシーケンスの長さを徐々に増やします。
したがって、(.+?)と(.*)は完全に異なります。文字列を指定"abc"すると、パターン(.+?)は"a"最初の一致に(.*)一致"abc"し、最初の一致に一致します。
パターンを意図した意味に修正すると、動作((?:.+)?)とまったく同じに(.*)なります。数量詞はデフォルトで貪欲なので、空の文字列の場合((?:.+)?)を試す前に、最初にの場合を試します。.+そして.+、1文字のシーケンスの前に最長のシーケンスを試します。したがって、の効果は((?:.+)?)次(.*)のようになります。最長のシーケンスが検出され、空の文字列の場合に徐々に戻ります。
初め、
. is any character
次
* is zero or more
+ is one or more
? is one or zero
あなたはそれを考えています。+?1つ以上の文字と0または1つの文字が推測されますか?あなたはこれを見逃しています:
怠惰な修飾子
*? is zero or more getting as few as possible
+? is one or more getting as few as possible
詳細については、ここを参照してください。 欲張りvs.嫌悪vs.所有格数量詞