0

K.Sierra を読んでいて、次の文章を見つけました。

貪欲な量指定子は、実際にはソース データ全体を読み取り、右端の一致が見つかるまで (右から) 逆方向に動作します。その時点で、ソース データの前の方から右端の一致の一部であるデータまでのすべてが含まれます。

ここで、次のようなソースがあるとします。

"proj3.txt,proj1sched.pdf,proj1,proj2,proj1.java"

そしてパターン:proj1([^,])*

なぜそれはテキスト全体と一致しないのですか? 貪欲であるため、右端の「proj1.java」と一致する必要があり、返された一致は、右端の一致の前のソース全体である必要がありますか? 代わりに次を返します。

proj1sched.pdf
proj1
proj1.java
4

3 に答える 3

2

なぜそれはテキスト全体と一致しないのですか?

あなたはそれがで始まらなければならないと述べたのでproj1

貪欲なので、右端の「proj1.java」に一致する必要があります

正しい。

返された一致は、最も右の一致の前のソース全体である必要がありますか?

なぜそれを考えるのか、なぜそれが役立つのかわかりません。それがあなたが望むものなら、あなたはただすることができ.*proj1.*ます。

于 2013-06-19T21:13:15.940 に答える
0

なぜそれはテキスト全体と一致しないのですか?

あ、やってみた。しかし、シーケンスp, r, o,が 1 つの場所で見つかった後j10 個以上のコンマではない文字が検出されたため、, ., 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+一致するものは何も残されず、正規表現の失敗です。
于 2013-06-19T21:37:48.230 に答える
-1

私たちはどれを持っproj1([^,])*ています -

([^,])*文字 ',' で構成されていない任意の文字の組み合わせ (ゼロ回以上発生) の部分文字列を、文字列 "proj1" と連結することを意味します: "sched.pdf" または " " または ".java" すべてthree には「,」文字は含まれません。したがって、結果。

于 2015-01-24T18:42:15.470 に答える