我有以下正则表达式(已更新):
([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)"
几乎在任何情况下,group7都是我的顶级域名(com、cn、org等)。但是,对于包含.com“而不是.comhttp/1.1”的行,它不起作用,并将组7返回为“searchanytime”而不是“com”
我一直在用www.regexr.com你知道吗
正则表达式
从我所看到的你试图做的事情来看,我得出了以下结论:
崩溃
我会分解正则表达式,这样如果它不是100%你正在寻找的,希望它会把你的方式
组1
捕获日志条目上的日期,格式为DD/MMM/YYYY
第2组
捕获此组和下一组之间的填充。在第一个示例中,这将匹配
:02:31:06 -0500] "
注意:如果POST
或GET
第3组
很自嘲
填料
匹配一个我们不关心的空白字符
第4组
也很直截了当
第5组
我想这就是你的正则表达式崩溃的地方。你知道吗
这将匹配日志条目的www或hpcgi1部分。注意到了吗?使此组成为可选的角色。这适用于以下情况:
第6组
中间部分(即canada44,nifty)或第一部分(即searchanytime)
第7组
结束部分(即com,org)
填料
“com”、“org”等和200之间的任何字符(尽可能少)。如果你想引用其中任何一个,你应该捕获它。你知道吗
结束
匹配200。注意,是因为?在上面的填充符中,这将是第7组之后的第一次200场比赛
免责声明
实际上,我还没有在您的日志消息上测试这个正则表达式。 我不确定你想要/需要什么样的分组,但希望这能有点帮助。你知道吗
相关问题 更多 >
编程相关推荐