.+
との違いを誰か説明してくれませんか.+?
私は文字列を持っています:"extend cup end table"
- パターンは次の
e.+d
ことを見つけます。extend cup end
- パターンは次を
e.+?d
見つけます:extend
およびend
私はそれ+
が1つ以上であり、?
1つまたは0であることを知っています。しかし、私はそれがどのように機能するのか理解できません。
.+
との違いを誰か説明してくれませんか.+?
私は文字列を持っています:"extend cup end table"
e.+d
ことを見つけます。extend cup end
e.+?d
見つけます:extend
およびend
私はそれ+
が1つ以上であり、?
1つまたは0であることを知っています。しかし、私はそれがどのように機能するのか理解できません。
両方とも、1 つ以上の文字の任意のシーケンスに一致します。違いは次のとおりです。
.+
貪欲で、できるだけ多くの文字を消費します。.+?
消極的で、消費する文字数をできるだけ少なくします。Java チュートリアルの貪欲、消極的、および所有量指定子の違いを参照してください。
したがって:
e.+d
e
で始まり、で終わるd
(間に少なくとも 1 文字を含む)最長の部分文字列を検索します。あなたの例extend cup end
では見つかります。e.+?d
そのような部分文字列の中で最も短いものを見つけます。あなたの例では、extend
andend
は2つの重複しない一致であるため、両方が見つかります。正規表現は に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