正则表达式匹配文件名排除特定扩展
问题描述:
我想从这个样子正则表达式匹配文件名排除特定扩展
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
这个工程Apache日志计数每分钟的访问,但我想避免计数访问对像SWZ静态文件,CSS, GIF,PNG,JPG等
我试图改变正则表达式
\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/[^ ]+(?!\.swz|\.gif|\.css|\.jpg)
但这仍然匹配。我想避免将它们全部匹配。
答
对您的正则表达式进行一些修改可以修复此问题。
\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/(?![^ ]+(\.swz|\.gif|\.css|\.jpg))[^ ]+
首先,我们检查,这是不可能匹配* .swz,* .gif注意,...之后GET | POST,然后捕获的文件名。
答
[^ ]+
正在消耗文件名,然后可以忽略负向预测。
尝试负先行,以防止比赛,包括整个文件名后增加一个[^ ]
...
\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/[^ ]+(?!\.swz|\.gif|\.css|\.jpg)[^ ]
虽然这种解决方案实际上没有工作,我爱的视觉表现 - 是由应用程序自动生成的吗? – Santrix
@ user2210814最后错过了+。并在这里进行视觉表示:http://www.regexper.com –