35

.+との違いを誰か説明してくれませんか.+?

私は文字列を持っています:"extend cup end table"

  1. パターンは次のe.+dことを見つけます。extend cup end
  2. パターンは次をe.+?d見つけます:extendおよびend

私はそれ+が1つ以上であり、?1つまたは0であることを知っています。しかし、私はそれがどのように機能するのか理解できません。

4

2 に答える 2

56

両方とも、1 つ以上の文字の任意のシーケンスに一致します。違いは次のとおりです。

  • .+貪欲で、できるだけ多くの文字を消費します。
  • .+?消極的で、消費する文字数をできるだけ少なくします。

Java チュートリアルの貪欲、消極的、および所有量指定子の違いを参照してください。

したがって:

  • e.+deで始まり、で終わるd(間に少なくとも 1 文字を含む)最長の部分文字列を検索します。あなたの例extend cup endでは見つかります。
  • e.+?dそのような部分文字列の中で最も短いものを見つけます。あなたの例では、extendandendは2つの重複しない一致であるため、両方が見つかります。
于 2013-01-08T11:22:56.860 に答える
16

正規表現は にe.+?d一致し'e'、次にできるだけ少ない文字 (貪欲でないか消極的) との一致を試み、その後に'd'. そのため、次の 2 つの部分文字列が一致します。

extend cup end table
^^^^^^     ^^^
  1         2

正規表現は、 にe.+d一致し'e'、次に可能な限り多くの文字に一致しようとします (貪欲) 'd'。何が起こるかというと、最初の'e'ものが見つかり、次に.+可能な限り一致します (行の終わりまたは入力まで):

extend cup end table
^^^^^^^^^^^^^^^^^^^^

正規表現エンジンが行末 (または入力) に来て'd'、正規表現パターンと一致しません。というわけで最後まで遡り'd'ます。そのため、単一の一致が検出されます。

extend cup end table
^^^^^^^^^^^^^^<----- backtrack
  1      
于 2013-01-08T11:33:32.320 に答える