Perl Regex: негативные взгляды - PullRequest
0 голосов
/ 09 января 2019

У меня есть этот тестовый текст:

cake/app/webroot/js/compiled/shop.js
cake/app/webroot/js/compiled/shop.min.js
cake/app/webroot/js/good/thing.js

Когда я пытаюсь это сделать:

/^(?!.*compiled)(?!.*min).*$/

Это ничего не соответствует. Но когда я добавлю:

/^.*

в начале, что-то соответствует каждой строке. (Я хочу, чтобы только последняя строка соответствовала.)

Чего мне не хватает?

1 Ответ

0 голосов
/ 09 января 2019

Ваш первый регулярное выражение соответствует третьей строке

my $re = qr/^(?!.*compiled)(?!.*min).*$/;
while(<DATA>) {
    chomp;
    if (/$re/) {
        say 'OK : ', $_;
    } else {
        say 'KO';
    }
}


__DATA__
cake/app/webroot/js/compiled/shop.js
cake/app/webroot/js/compiled/shop.min.js
cake/app/webroot/js/good/thing.js

Выход:

KO
KO
OK : cake/app/webroot/js/good/thing.js

Когда вы добавляете .* в начале, оно совпадает со всей строкой, тогда отрицательный прогноз - истина, нет compiled или min после того, как регулярное выражение использует все символы, поэтому совпадение истинно.

...