У меня есть очень простая замена:
my $s = "<a>test</a> <a>test</a>";
$s =~ s{ <a> .+? </a> $ }{WHAT}x;
print "$s\n";
, которая печатает:
WHAT
Но я ожидал:
<a>test</a> WHAT
Что я неправильно понимаю"конец строки привязки" во взаимодействии с опцией ungreedy?
Итак, я был неправ насчет движка регулярных выражений.В самом деле, не гуманизируйте код - он делает правильно то, что вы написали, а не вы " думайте, делайте ".
Просто сначала найдите <a>
, а затем найдите </a>$
.Первая блокировка положительна, шаблон соответствует.
Правильный шаблон должен быть примерно таким:
$s =~ s{ <a> (?! .* <a> ) .* </a> }{WHAT}x;
, что дает мне правильно
<a>test</a> WHAT
, потому что сейчас Я действительно попросил регулярное выражение для last <a>
.
Я думаю, что это менее эффективно [^<]+
, но более гибко.