У меня проблема с нежадным регулярным выражением (регулярным выражением). Я видел, что есть вопросы относительно нежадных регулярных выражений, но они не отвечают на мою проблему.
Проблема: я пытаюсь сопоставить href привязки lol.
Примечание. Я знаю, что это можно сделать с помощью модулей синтаксического анализа HTML Perl, и мой вопрос не о синтаксическом анализе HTML в Perl. Мой вопрос касается самого регулярного выражения, а HTML - всего лишь пример.
Тестовый пример: у меня есть четыре теста для .*?
и [^"]
. Два первых дают ожидаемый результат. Однако третий нет, а четвертый просто делает, но я не понимаю, почему.
- Почему третий тест не проходит как для
.*?
, так и для[^"]
? Разве не должен работать не жадный оператор? - Почему четвертый тест работает в обоих тестах для
.*?
и[^"]
? Я не понимаю, почему включение.*
впереди меняет регулярное выражение (третий и четвертый тесты такие же, за исключением.*
впереди).
Я, наверное, не совсем понимаю, как работают эти регулярные выражения. В рецепте Perl Cookbook что-то упоминается, но я не думаю, что это отвечает на мой вопрос.
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 ;