私はいくつかの古いコードベースを調べており、意味的に同一であると思う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.所有格数量詞