2

私はいくつかの古いコードベースを調べており、意味的に同一であると思う2つの正規表現部分に出くわしました。Stackoverflowコミュニティが私の理解を確認できるのだろうか。

RegEx 1:(。+?)-1つ以上の文字、ただしオプション

正規表現2:(。*)-0文字以上

私はさまざまなシナリオを考え続けていますが、両方の式が同じにならない入力は考えられません。

4

2 に答える 2

7

(.+?)1つ以上の文字に一致することを意味しますが、デフォルトの欲張り一致(可能な限り一致)の代わりに、?後の数量詞は一致を怠惰にします(可能な限り一致しません)。

概念的には、欲張りマッチングは、最初に内部のパターンによって形成できる可能な限り長いシーケンスを試行し、次にエンジンがバックトラックするにつれてシーケンスの長さを徐々に減らします。レイジーマッチングは、最初に内部のパターンによって形成できる最短のシーケンスを試行し、次にエンジンがバックトラックするにつれてシーケンスの長さを徐々に増やします。

したがって、(.+?)(.*)は完全に異なります。文字列を指定"abc"すると、パターン(.+?)"a"最初の一致に(.*)一致"abc"し、最初の一致に一致します。

パターンを意図した意味に修正すると、動作((?:.+)?)とまったく同じに(.*)なります。数量詞はデフォルトで貪欲なので、空の文字列の場合((?:.+)?)を試す前に、最初にの場合を試します。.+そして.+、1文字のシーケンスの前に最長のシーケンスを試します。したがって、の効果は((?:.+)?)(.*)のようになります。最長のシーケンスが検出され、空の文字列の場合に徐々に戻ります。

于 2013-02-21T02:50:04.027 に答える
3

初め、

. 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.所有格数量詞

于 2013-02-21T02:53:38.957 に答える