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