我有以下正则表达式(已更新):
([0-9]{2}/[a-zA-Z]{3}/[0-9]{4})(.+)(GET|POST)\s(http://|https://)([a-zA-Z-.][a-zA-Z0-9+\.[a-zA-Z0-9-.]+)(\.)([a-zA-Z0-9]+)([\.:/\s]).+?"\s200
我还从长服务器日志中摘录了以下行(已更新):
218.5.192.147 - - [14/Mar/2004:02:31:06 -0500] "GET http://searchanytime.com" 200 - "-" "-"
202.101.150.100 - - [12/Mar/2004:21:18:55 -0500] "GET http://nationalwholesalellc.com" 200 114887 "-" "-"
它按计划用于这些行:
220.173.17.142 - - [09/Mar/2004:23:32:13 -0500] "POST http://www.canada44.ca/ HTTP/1.1" 200 27095 "http://www.so123.com" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)"
212.160.136.163 - - [10/Mar/2004:01:01:46 -0500] "GET http://www.6seconds.org/ HTTP/1.0" 200 51937 "http://www.helavasearch.com/cgi-bin/search.cgi?username=amundii&keywords=parenting" "Mozilla/4.0 (compatible; MSIE 4.0; Windows 98)"
218.72.85.59 - - [10/Mar/2004:01:05:13 -0500] "GET http://hpcgi1.nifty.com/trino/ProxyJ/prxjdg.cgi HTTP/1.1" 200 2221 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
在几乎所有情况下,第7组都是我的顶级域名(com,cn,org等)。但是对于具有.com“而不是.com HTTP / 1.1”的行,它不起作用并将组7作为“searchanytime”而不是“com”返回
我一直在使用www.regexr.com
答案 0 :(得分:0)
从我所看到的你想要做的事情中,我想出了以下内容:
(\d{2}/\w{3}/\d{4})(.+)(GET|POST)\s(http://|https://)(\w+)?\.?([\w\d]+)\.(\w+).*?200
我会对正则表达式进行细分,以便如果它不是100%正在寻找的东西,那么希望它会让你顺路而上
(\d{2}/\w{3}/\d{4})
捕获日志条目上的日期,格式为DD / MMM / YYYY
(.+)
捕获此组与下一组之间的填充物。从您的第一个示例开始,这将匹配:02:31:06 -0500] "
注意:如果POST
或GET
(GET|POST)
漂亮的自我解释
\s
匹配我们不关心的单个空格字符
(http://|https://)
也很直接
这是你认为你的正则表达式崩溃的地方。
(\w+)?\.?
这将匹配日志条目的www或hpcgi1部分。注意?角色使这个组可选。这适用于
等情况[14/Mar/2004:02:31:06 -0500] "GET http://searchanytime.com" 200 - "-" "-"
([\w\d]+)
中间部分(即canada44,nifty)或第一部分(即searchanytime)
([\w\d]+)
结束部分(即com,org)
.*?
'com','org'等与200之间的任何字符(尽可能少)。如果你想引用其中任何一个,你应该捕获它。
200
匹配200.注意,因为?在上面的填充中,这将是group7之后匹配遇到的前200个
我实际上没有在在线regex tool之外的日志消息上测试此正则表达式。 我不确定你想要/需要的分组,但希望这会有所帮助。