正则表达式匹配文件名,不包括特定扩展

时间:2014-03-27 10:41:20

标签: regex negative-lookahead

我试图通过看起来像这样的apache日志来计算每分钟的访问次数

domain.com:10.10.10.10 - - [26/Mar/2014:14:14:12 +0000] "GET /online_catalogue/files/flash/libs/framework_4.6.0.23201.swz HTTP/1.0" 200 327044 "http://www.domain.com/online_catalogue/files/flash/flippingbook.swf?key=foobar" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
perl -ne '$a{$1}++ if /\[(.+?:[0-9]{2}:[0-9]{2})/; END { foreach $k(keys %a) { print "$k $a{$k}\n"; } }' logfile | sort

这有效,但我想避免计算对swz,css,gif,png,jpg等静态文件的访问。

我尝试将正则表达式改为

\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/[^ ]+(?!\.swz|\.gif|\.css|\.jpg)

但这仍然匹配。我想避免将它们全部匹配。

2 个答案:

答案 0 :(得分:1)

对正则表达式进行一些修改可以解决问题。

\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/(?![^ ]+(\.swz|\.gif|\.css|\.jpg))[^ ]+

首先,我们检查在GET | POST之后不能匹配* .swz,* .gif,...然后捕获文件名。

答案 1 :(得分:0)

[^ ]+正在使用文件名,然后可以忽略负面预测。

尝试在负面预测后添加另一个[^ ],以防止包含整个文件名的匹配...

\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/[^ ]+(?!\.swz|\.gif|\.css|\.jpg)[^ ]

regex diagram

相关问题