使用正则表达式解析特定日志?

时间:2014-12-04 17:34:03

标签: regex

日志示例是

DHCPRELEASE of 123.4.5.89 from 12:34:45:56:78:90 (Johns-Iphone) via eth1 relay 1.3.4.4

其中123.4.5.89是ip地址,12:34:45:56:78:90是mac地址,Johns-Iphone是Host。

案例1 - 我希望这有没有匹配组(缺少左括号)

DHCPRELEASE of 123.4.5.89 from 12:34:45:56:78:90 Johns-Iphone) via eth1 relay 1.3.4.4

案例2 - 可以解析

DHCPRELEASE of 123.4.5.89 from 12:34:45:56:78:90 (Johns-Iphone) via eth1 relay 1.3.4.4

案例3 - 这也可以解析

DHCPRELEASE of 123.4.5.89 from 12:34:45:56:78:90 via eth1 relay 1.3.4.4

案例4 - 这也可以解析

DHCPRELEASE of 123.4.5.89 from 12:34:45:56:78:90

以下是解析此特定日志的正则表达式:

DHCPRELEASE\sof\s((?:[0-9]{1,3}\.){3}(?:[0-9]{1,3}))\sfrom\s((?:[a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2})(?:\s\((.*?)\))?

然而,我的正则表达式 NOT 工作我想要的。有人可以帮忙吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

DHCPRELEASE\sof\s((?:[0-9]{1,3}\.){3}(?:[0-9]{1,3}))\sfrom\s((?:[a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2})(?:\s\(([^)]*)\))?(?=\svia|$)

即。最后有一个预测(?=\svia),以确保案例1不匹配(...)

RegEx Demo

答案 1 :(得分:0)

因为(?:\s\((.*?)\))?是可选的,所以不要强制括号匹配。 它只匹配子串

DHCPRELEASE of 123.4.5.89 from 12:34:45:56:78:90

并忽略其余部分。

您可以将“via”附加到正则表达式以强制匹配,直到该点。

修改

更准确地说,您可以在正则表达式中添加开始和结束锚点,使其与整行匹配。

例如

^DHCPRELEASE\sof\s((?:[0-9]{1,3}\.){3}(?:[0-9]{1,3}))\sfrom\s((?:[a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2})(?:\s\((.*?)\))?( via eth1 relay.*)?$

将匹配整行或什么都不匹配。注意“^”匹配行的开头,“$”匹配结束。