2

重複の可能性:
正規表現で怠惰で貪欲とはどういう意味ですか?

正規表現では、*、+、または?の後に疑問符が付いていることを知っています。貪欲ではないという意味ですが、任意の文字に一致させたい場合、(。*)と(。*?)を使用することの違いは何ですか?

ありがとう。

編集:私の場合、URLを確認したいと思います。の違いは何ですか

http://site\.net/(.*?)\.html

http://site\.net/(.*)\.html

4

4 に答える 4

21

.*は貪欲です。つまり、次の正規表現.*がターゲット文字列の終わりに反しない限り、正規表現自体が満たされなくなるまで、正規表現の次の区切り文字を無視します。

.*?は貪欲ではありません。つまり、次の区切り文字が満たされると、正規表現の次の区切り文字に進みます。それ自体がまだ適用可能であっても、次の区切り文字に進みます。

例:

/(.*) dog/「あなたの犬が私の犬を噛んだと思います」と一致し、グループ1は「あなたの犬が私の犬を噛んだと思います」になります。

/(.*?) dog/「あなたの犬が私の犬を噛んだと思います」と一致し、グループ1は「私はあなたの犬だと思います」になります。

于 2012-08-30T13:09:19.643 に答える
6

正規表現の後に何も続かない場合(.*)は、まったく違いはありません。ただし、次のようなものがある場合は、違いがあります。

"I went to the shops and then I went home"

/(.*) went/  => "[I went to the shops and then I] went"
/(.*?) went/ => "[I] went"
于 2012-08-30T13:10:41.377 に答える
3

次の URL を取得したとします。

http://example.net/some/wierd/path.html?returnTo=somedoc.html

Greedy は行全体に一致します。

http://example.net/some/wierd/path.html?returnTo=somedoc.html

貪欲でない場合は次のように返されます。

http://example.net/some/wierd/path.html

http://refiddle.com/は、正規表現を試すのに最適です

于 2012-08-30T13:29:04.567 に答える
2

貪欲でない行動はすでにご存知のとおり、これについては説明しません。

それはの後に何が来るかによって異なります(.*?)- それが貪欲な行動です。

興味深いことに、これはフォームの正規表現が/(.*?)/あまり意味をなさないことを意味します。

この正規表現をRegexrなどで作成しようとすると、ナンセンスなのでコンパイルすらできません。

グループの後ろに何かを置いた場合にのみ、正規表現は何らかの意味を持ちます。ここですべての正規表現エンジンが正規表現と同じことを行い、その正規表現の受け入れを拒否するかどうかはわかりません。

したがって、特定の文字まで何でも一致させたい場合は、その特定の文字ungreedy-anything-group の後に配置する必要があります。このようにして、その特定の文字より前のすべてが一致します。

結論を出すために; グループの後に何かがなければ、違いはありませ

于 2012-08-30T13:13:03.193 に答える