首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用regex解析特定日志?

使用regex解析特定日志?
EN

Stack Overflow用户
提问于 2014-12-04 17:34:03
回答 2查看 37关注 0票数 1

日志示例是

代码语言:javascript
运行
复制
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是主机。

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

代码语言:javascript
运行
复制
DHCPRELEASE of 123.4.5.89 from 12:34:45:56:78:90 Johns-Iphone) via eth1 relay 1.3.4.4

案例2-这可以被解析

代码语言:javascript
运行
复制
DHCPRELEASE of 123.4.5.89 from 12:34:45:56:78:90 (Johns-Iphone) via eth1 relay 1.3.4.4

案例3-这也可以被解析

代码语言:javascript
运行
复制
DHCPRELEASE of 123.4.5.89 from 12:34:45:56:78:90 via eth1 relay 1.3.4.4

案例4--这也可以被解析

代码语言:javascript
运行
复制
DHCPRELEASE of 123.4.5.89 from 12:34:45:56:78:90

这里是解析这个特定日志的正则表达式:

代码语言:javascript
运行
复制
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\((.*?)\))?

但是,我的regex做的是,而不是,这是我想要的。有人能帮忙吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-04 17:54:29

您可以使用这个regex:

代码语言:javascript
运行
复制
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演示

票数 1
EN

Stack Overflow用户

发布于 2014-12-04 17:57:14

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

代码语言:javascript
运行
复制
DHCPRELEASE of 123.4.5.89 from 12:34:45:56:78:90

而忽视其他人。

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

编辑

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

例如

代码语言:javascript
运行
复制
^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.*)?$

将与整条线匹配否则什么都不匹配。注:"^“与行首相匹配,"$”与末尾匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27300361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档