重複の可能性:
正規表現で怠惰で貪欲とはどういう意味ですか?
正規表現では、*、+、または?の後に疑問符が付いていることを知っています。貪欲ではないという意味ですが、任意の文字に一致させたい場合、(。*)と(。*?)を使用することの違いは何ですか?
ありがとう。
編集:私の場合、URLを確認したいと思います。の違いは何ですか
http://site\.net/(.*?)\.html
と
http://site\.net/(.*)\.html
?
重複の可能性:
正規表現で怠惰で貪欲とはどういう意味ですか?
正規表現では、*、+、または?の後に疑問符が付いていることを知っています。貪欲ではないという意味ですが、任意の文字に一致させたい場合、(。*)と(。*?)を使用することの違いは何ですか?
ありがとう。
編集:私の場合、URLを確認したいと思います。の違いは何ですか
http://site\.net/(.*?)\.html
と
http://site\.net/(.*)\.html
?
.*
は貪欲です。つまり、次の正規表現.*
がターゲット文字列の終わりに反しない限り、正規表現自体が満たされなくなるまで、正規表現の次の区切り文字を無視します。
.*?
は貪欲ではありません。つまり、次の区切り文字が満たされると、正規表現の次の区切り文字に進みます。それ自体がまだ適用可能であっても、次の区切り文字に進みます。
例:
/(.*) dog/
「あなたの犬が私の犬を噛んだと思います」と一致し、グループ1は「あなたの犬が私の犬を噛んだと思います」になります。
/(.*?) dog/
「あなたの犬が私の犬を噛んだと思います」と一致し、グループ1は「私はあなたの犬だと思います」になります。
正規表現の後に何も続かない場合(.*)
は、まったく違いはありません。ただし、次のようなものがある場合は、違いがあります。
"I went to the shops and then I went home"
/(.*) went/ => "[I went to the shops and then I] went"
/(.*?) went/ => "[I] went"
次の 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/は、正規表現を試すのに最適です
貪欲でない行動はすでにご存知のとおり、これについては説明しません。
それはの後に何が来るかによって異なります(.*?)
- それが貪欲な行動です。
興味深いことに、これはフォームの正規表現が/(.*?)/
あまり意味をなさないことを意味します。
この正規表現をRegexrなどで作成しようとすると、ナンセンスなのでコンパイルすらできません。
グループの後ろに何かを置いた場合にのみ、正規表現は何らかの意味を持ちます。ここですべての正規表現エンジンが正規表現と同じことを行い、その正規表現の受け入れを拒否するかどうかはわかりません。
したがって、特定の文字まで何でも一致させたい場合は、その特定の文字をungreedy-anything-group の後に配置する必要があります。このようにして、その特定の文字より前のすべてが一致します。
結論を出すために; グループの後に何かがなければ、違いはありません。