试图构建一个灵活的正则表达式,用于解析结构糟糕的系统日志,其中包含许多可选的命名捕获组。
型号:
<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),以下表达式工作良好:
(?<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模式来对其进行排序。这是行不通的:
(?<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
在这个表达式的最后一部分之前,我尝试了以下所有内容:
.+?((to)?)?
.*(to)? # this and similar ones just greedily capture everything until end of string, without a capture for `to`
.*?((to)?)?提前感谢!
发布于 2022-07-28 07:26:54
如果一切都是非贪婪的,之后没有什么可处理的,那么regex引擎可以尽可能地满足匹配的要求。
您必须将非贪婪点与实际匹配的to作为一个整体放在非捕获组(?:.*? to\b)?中。
(?<hostname>\S+?)(\s)?:(\s)?\%ASA.+?(\sfor|\sfrom).+?(:|=)?\b(?<srcip>(?:[0-9]{1,3}\.){3}[0-9]{1,3})(\/|:)?((?<srcport>\d+))?(?:.*? to\b)?https://stackoverflow.com/questions/73148243
复制相似问题