首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Regex -可选捕获字符串的末尾未被识别

Regex -可选捕获字符串的末尾未被识别
EN

Stack Overflow用户
提问于 2022-07-28 06:33:34
回答 1查看 41关注 0票数 1

试图构建一个灵活的正则表达式,用于解析结构糟糕的系统日志,其中包含许多可选的命名捕获组。

型号:

代码语言:javascript
运行
复制
<166>Jul 01 2022 11:34:34 some-hostname : %ASA-foobar: Built outbound TCP connection 1234566 for mpls:192.168.1.1/80 (192.168.1.1/80) to inside:8.8.8.8/443 (8.8.8.8/443)

直到第一个ipv4和端口(标记为srcip/srcport),以下表达式工作良好:

代码语言:javascript
运行
复制
(?<hostname>\S+?)(\s)?:(\s)?\%ASA.+?(\sfor|\sfrom).+?(:|=)?\b(?<srcip>(?:[0-9]{1,3}\.){3}[0-9]{1,3})(\/|:)?((?<srcport>\d+))?.+?

https://regex101.com/r/ViuaY2/1

但是,一旦我尝试(可选地)捕获任何后续模式,匹配就会停止工作。

也就是说,在源ip/端口信息之后,日志中可能有也可能没有其他详细信息。如果有,我想抓住它。

在解决更复杂的目标ip/端口捕获之前,尝试通过让表达式可选地捕获to模式来对其进行排序。这是行不通的:

代码语言:javascript
运行
复制
(?<hostname>\S+?)(\s)?:(\s)?\%ASA.+?(\sfor|\sfrom).+?(:|=)?\b(?<srcip>(?:[0-9]{1,3}\.){3}[0-9]{1,3})(\/|:)?((?<srcport>\d+))?.+?(to)?

https://regex101.com/r/9aLDhc/1

在这个表达式的最后一部分之前,我尝试了以下所有内容:

代码语言:javascript
运行
复制
.+?((to)?)?
.*(to)? # this and similar ones just greedily capture everything until end of string, without a capture for `to` 
.*?((to)?)?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-28 07:26:54

如果一切都是非贪婪的,之后没有什么可处理的,那么regex引擎可以尽可能地满足匹配的要求。

您必须将非贪婪点与实际匹配的to作为一个整体放在非捕获组(?:.*? to\b)?中。

代码语言:javascript
运行
复制
(?<hostname>\S+?)(\s)?:(\s)?\%ASA.+?(\sfor|\sfrom).+?(:|=)?\b(?<srcip>(?:[0-9]{1,3}\.){3}[0-9]{1,3})(\/|:)?((?<srcport>\d+))?(?:.*? to\b)?

Regex演示

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

https://stackoverflow.com/questions/73148243

复制
相关文章

相似问题

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