【发布时间】:2011-03-16 16:01:42
【问题描述】:
我在编写正则表达式查询以提取日志文件中的所有网站地址时需要帮助。日志文件的每一行都包含一堆信息(IP 地址、协议、字节、请求的网站等...)。
具体来说,我想删除以“http://”开头并以特定“.ENDING”结尾的所有内容,其中我指定“ENDING = com, biz, net, tv, info” 我不关心完整的网址(即:http://www.google.com/bla/page2=blablabla,只需 http://www.google.com)。这个正则表达式查询更难的部分是我希望它在包含 .com 或 .info 或 .biz 作为子域的域(即:http://www.google.com.MaliciousWebsite.com)上获取在这种情况下,要在 google.com 上捕获完整的域,而不是在 google.com 上截断它?
我以前从未写过正则表达式查询,所以我尝试使用在线参考图表 (http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/) 但我很挣扎。这是我目前所拥有的:
"\A[http://]\Z[\.][com,info,biz,tv,net]"
*抱歉 URL 中的间距,但 stackoverflow 正在标记它们,因为我是新手,所以我最多只能发布 2 个。
感谢您的帮助。
已更新:根据迄今为止每个人的出色反馈,我认为编写此规则会更好,以便它适用于介于(http或https)之间的所有内容) 和 (无效的 URL 字符:?,!,@,#,$,%,^,&,*,(,),[,{,},],|,/,',",;,)
这将确保所有 TLD 都被抓取,并且 google.com.bad.website.com 等网站也被抓取。到目前为止,这是我的模型:
"\A[https?://]'?!(!@#$%^&*()-=[]{}|\'";,<>)"
再次感谢大家的帮助。
【问题讨论】:
-
除了您列出的扩展名之外,还有其他扩展名(例如 .gov 和 .edu)。你只想捕捉那些吗?
-
我没有列出所有这些,但我会彻底扫描以获取所有 TLD 扩展名,如您列出的 gov、edu、tv、net 等...
-
这很好,但请记住,它们有很多,而且它们会定期更改。 IP 地址或特殊域名呢?
http://192.168.0.1是有效的,http://localhost也是如此。还要考虑端口号(即http://example.com:8080),我不知道您是否要捕获这些。恕我直言,您应该抓住所有内容,直到域名中不允许出现的第一个字符。 -
这可能会使一切变得更简单,因为您建议只需抓住所有内容,直到出现不允许的字符。所以 ?![\?|\=|\@|\#|\$|] 的结尾应该有效吗?
-
在这种情况下,我的回答应该对你有用。顺便说一句 - 除非你使用我不熟悉的正则表达式风格,
[]、\Z和,不要做你认为他们做的事。您上面示例的想法似乎是\A(http://)(.+?)\.(com|info|biz|tv|net),但我不确定您是否要使用\Z。
标签: regex