なぜそれはテキスト全体と一致しないのですか?
あ、やってみた。しかし、シーケンスp
, r
, o
,が 1 つの場所で見つかった後j
、1
0 個以上のコンマではない文字が検出されたため、, .
, p
,d
と一致しますf
。そして、次の文字であるカンマが一致しなかったため、そこで停止しました[^,]
。
次のマッチングの試行は、次の文字、つまり から開始されることに注意してr
くださいp
。見つかったらr
、などを試します。
正規表現は完全に満たされているため、エンジンはそれが成功したと判断し、それ以上の一致があったとしてもそれ以上試行しませんでした。
したがって、一致するテキストproj1.pdf
は です。入力全体ではありません。正規表現は怠け者です。一致させる必要があるものだけに一致し、それ以上は進みません。
しかし。そして、これが興味深いところです。一部のエンジンはこの方法では機能しません。
正規表現cat(|flap)
と入力テキストを考えてみましょうcatflap
。POSIX は正規表現エンジンを試し、正規表現エンジンは最も左端の最長一致に一致するように指示しました。
したがって、正規表現エンジンが POSIX に従う場合、一致するはずcatflap
です。しかし、現存するほとんどの正規表現エンジンは、ここでは一致するだけcat
です: 空の代替が最初に一致し、正規表現が満たされ、話の終わりです!
ここで、質問の核心に移ります。量指定子には、貪欲、怠惰、所有格の 3 つのタイプがあります。
- 貪欲:デフォルト、
*
;
- 怠け者、別名使いすぎ:
*?
;
- 所有格:
*+
.
貪欲な量指定子は、できる限り多くのテキストを一致させようとし、必要な場合にのみ返します。怠惰な量指定子は、できる限り少ないテキストと一致しようとします。所有量指定子はできるだけ多くのテキストと一致させようとしますが、テキストは返されません。
イラスト: ここに入力テキストがあります:
The answer to everything is 42, says the mouse
キャプチャ グループを使用して、このテキストに一致する 3 つの正規表現を次に示します。
.*(\d+)
(よく深い);
.*?(\d+)
(怠惰);
.*+(\d+)
(所有格)。
質問: グループはこれらの表現のそれぞれで何を捉えますか? 答え:
- 最初:
2
;
- 2番目:
42
;
- 3 番目: テキストと一致しません!
.*+
すべてを飲み込みますが、返さないため、\d+
一致するものは何も残されず、正規表現の失敗です。