欲張りでない正規表現(regex)に問題があります。欲張りでない正規表現に関する質問があるのを見てきましたが、それらは私の問題に答えません。
問題:「lol」アンカーのhrefを一致させようとしています。
注:これはPerl HTML解析モジュールで実行できることを知っています。私の質問は、PerlでのHTMLの解析に関するものではありません。私の質問は正規表現自体についてであり、HTMLは単なる例です。
テストケース:との4つのテストが.*?
あり[^"]
ます。2つは、最初に期待される結果を生成します。しかし、3番目はそうではなく、4番目はちょうどそうですが、理由はわかりません。
.*?
との両方のテストで3番目のテストが失敗するのはなぜ[^"]
ですか?貪欲でないオペレーターは機能すべきではありませんか?.*?
との両方のテストで4番目のテストが機能するのはなぜ[^"]
ですか?前に含めると正規表現が変わる理由がわかりません.*
(3番目と4番目のテストは前を除いて同じ.*
です)。
私はおそらく、これらの正規表現がどのように機能するかを正確に理解していません。Perlクックブックのレシピは何かについて言及していますが、それが私の質問に答えるとは思いません。
use strict;
my $content=<<EOF;
<a href="/hoh/hoh/hoh/hoh/hoh" class="hoh">hoh</a>
<a href="/foo/foo/foo/foo/foo" class="foo">foo </a>
<a href="/bar/bar/bar/bar/bar" class="bar">bar</a>
<a href="/lol/lol/lol/lol/lol" class="lol">lol</a>
<a href="/koo/koo/koo/koo/koo" class="koo">koo</a>
EOF
print "| $1 | \n\nThat's ok\n" if $content =~ m~href="(.*?)"~s ;
print "\n---------------------------------------------------\n";
print "| $1 | \n\nThat's ok\n" if $content =~ m~href="(.*?)".*>lol~s ;
print "\n---------------------------------------------------\n";
print "| $1 | \n\nWhy does not the 2nd non-greedy '?' work?\n"
if $content =~ m~href="(.*?)".*?>lol~s ;
print "\n---------------------------------------------------\n";
print "| $1 | \n\nIt now works if I put the '.*' in the front?\n"
if $content =~ m~.*href="(.*?)".*?>lol~s ;
print "\n###################################################\n";
print "Let's try now with [^]";
print "\n###################################################\n\n";
print "| $1 | \n\nThat's ok\n" if $content =~ m~href="([^"]+?)"~s ;
print "\n---------------------------------------------------\n";
print "| $1 | \n\nThat's ok.\n" if $content =~ m~href="([^"]+?)".*>lol~s ;
print "\n---------------------------------------------------\n";
print "| $1 | \n\nThe 2nd greedy still doesn't work?\n"
if $content =~ m~href="([^"]+?)".*?>lol~s ;
print "\n---------------------------------------------------\n";
print "| $1 | \n\nNow with the '.*' in front it does.\n"
if $content =~ m~.*href="([^"]+?)".*?>lol~s ;