Perl正则表达式:负前瞻

时间:2019-01-09 15:59:20

标签: regex perl negative-lookahead

我有以下测试文字:

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 :(得分:2)

您的第一个正则表达式与第三行匹配

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

当您在开头添加.*时,它与整行匹配,那么负前瞻为true,在正则表达式消耗完所有字符后,没有compiledmin,所以匹配是真的。