为了账号安全,请及时绑定邮箱和手机立即绑定

如何改进这个正则表达式以在其他情况下工作?

如何改进这个正则表达式以在其他情况下工作?

ABOUTYOU 2021-10-12 16:37:34
我可以拆分这个字符串:199.72.81.55 - - [01/Jul/1995:00:00:01 -0400] "GET /history/apollo/ HTTP/1.0" 200 6245使用这个正则表达式:'([(\d\.)]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'那么如何改进这个 RegEx 来拆分这种字符串(那里有互联网地址而不是 IP):unicomp6.unicomp.net - - [01/Jul/1995:00:00:06 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985和这种字符串(双引号之间有双引号,我没有最后一个数字)frank.mtsu.edu - - [03/Jul/1995:02:41:15 -0400] "GET /images/" HTTP/1.0" 404 -谢谢!
查看完整描述

2 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

对于这种情况|运算符的含义或有用,对于您的第二个示例,您可以将表达式修改为:

'([(\d\.)]+|[a-z\d\.]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'

请注意,这假定所有地址仅由小写字母数字和点组成。编辑:@tripleee评论后我必须承认地址可能包含更多不同的字符,因此我添加了更宽容的解决方案:

'([(\d\.)]+|[^ ]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'

这个假设地址可能包含任何不是空格的字符。如果这太宽容,请随时改进早期版本。如评论中所述,它是多余的,可能会替换为

'([^ ]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'

要使其适用于最后一种情况,只需将 last 替换(\d+)(\d+|-),正如@solarc前面所建议的


查看完整回答
反对 回复 2021-10-12
  • 2 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信