日志示例是
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 工作我想要的。有人可以帮忙吗?
谢谢!
答案 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不匹配(...)
。
答案 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.*)?$
将匹配整行或什么都不匹配。注意“^”匹配行的开头,“$”匹配结束。