Почему это положительное утверждение не работает при привязке к началу строки? - PullRequest
3 голосов
/ 28 июля 2010

Почему это утверждение с предварительным просмотром не работает, когда оно привязано к началу строки? Запустите следующий код, и вы увидите, что первый тест проходит, но второй, который зависит только от привязки ^, завершается неудачей.

use Test::More tests => 2;

my $s = '/123/456/hello';    
$s =~ s{(?<=/)\d+(?=/\d+/hello)}{0};  # unanchored
is($s, '/0/456/hello', 'unanchored'); # passes

$s = '/123/456/hello';
$s =~ s{^(?<=/)\d+(?=/\d+/hello)}{0}; # anchored
is($s, '/0/456/hello', 'anchored');   # fails

Перемещение ^ в проверочное утверждение для меня не вариант (это очень упрощенный пример), но это решает проблему. Я нашел альтернативный способ делать то, что я хочу, но мне любопытно, почему этот подход не сработал. Я проверял это на Perl 5.8.8 и Perl 5.10.0.

Ответы [ 4 ]

9 голосов
/ 28 июля 2010

Помните, что утверждение имеет нулевую ширину и не использует символы, которым оно соответствует.Поэтому якорь должен входить в утверждение, иначе все выражение не будет совпадать.

6 голосов
/ 28 июля 2010

(?<=/)\d+(?=/hello) в вашей строке соответствует 456, поскольку это единственная часть строки, к которой будут применяться оба обходных пути.Когда вы привязываете свое выражение, оно больше не может соответствовать чему-либо.Внешний вид равен нулевой ширине, поэтому ваш второй шаблон говорит: «соответствовать одной или нескольким цифрам, начиная с начала строки, где предыдущий символ - косая черта», что, очевидно, невозможно.

4 голосов
/ 28 июля 2010

Я думаю, это потому, что (? <= Положительный взгляд позади (не отрицательный), и вы не можете иметь символ перед началом строки. Если вы после отрицательного взгляда позади, вы должны использовать (? < ! вместо. </p>

1 голос
/ 28 июля 2010

Перед передней частью жала нет ничего, так что любой непустой взгляд сзади потерпит неудачу, когда якорь с ^.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...