首页 > 解决方案 > 流集中的正则表达式

问题描述

嗨,我想使用 Streamsets 打破日志文件。日志就像,

Deny tcp src dmz:77.77.77.7/61112 dst dmz:55.55.56.57/139 by access-group "outside_access_in" [0x8b3ecfdc, 0x0]

日志中可能还有超过 2 个 IP,我正在尝试从我的日志中捕获唯一的第一个和第二个 IP 地址。据说 Streamsets 使用 Java REGEX 模式。

到目前为止,我在 Streamsets 的 Expression Evaluator 处理器中所做的是,

${str:regExCapture(record:value('/Message'),'(\\d+[.]\\d+[.]\\d+[.]\\d+/?\\d*)', 1)}

知道如何捕获第二个 IP 吗?

标签: javaregexstreamsets

解决方案


您可以使用

${str:regExCapture(record:value('/Message'),'^(?:.*?(\\d+(?:[.]\\d+){3}(?:/\\d+)?)){2}', 1)}

请参阅正则表达式演示

细节

  • ^- 字符串的开始
  • (?:.*?(\\d+(?:[.]\\d+){3}(?:/\\d+)?)){2}- 两次连续出现
    • .*?- 除换行符以外的任何 0+ 字符,尽可能少
    • (\\d+(?:[.]\\d+){3}(?:/\\d+)?)- 捕获组 1(它的值将被返回,str:regExCapture因为最后一个参数设置为1):
      • \\d+- 1+ 位数
      • (?:[.]\\d+){3}- 出现 3 次.和 1+ 位
      • (?:/\\d+)?- 一个可选的/和 1+ 数字序列。

由于在一次匹配操作中捕获多个匹配项时会重写组中的内容,因此组 1 将仅包含第二个 IP 值。

请注意,更好(更安全、更精确)的 IP 模式是(?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(?:\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3},请参阅使用 regex 从字符串中提取 ip 地址。因此,您也可以将命令编写为

 ${str:regExCapture(record:value('/Message'),'^(?:.*?\\b((?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}(?:/\\d+)?)){2}', 1)}

查看另一个正则表达式演示


推荐阅读