Java 流集中的正则表达式

Java 流集中的正则表达式,java,regex,streamsets,Java,Regex,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地址。据说Streamset使用Java正则表达式模式 到目前为止,我在Streamset中的Expression Evaluator处理器中所做的是 ${st

嗨,我想用流集破坏日志文件。日志就像

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地址。据说Streamset使用Java正则表达式模式

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

${str:regExCapture(record:value('/Message'),'(\\d+[.]\\d+[.]\\d+[.]\\d+/?\\d*)', 1)}
您知道如何捕获第二个IP吗?

您可以使用

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

详细信息

  • ^
    -字符串的开头
  • (?:.*(\\d+(?:[.]\\d+{3}(?:/\\d+){2}
    -连续出现两次
    • *?
      -除换行符以外的任何0+字符,尽可能少
    • (\\d+(?:[.]\\d+{3}(?:/\\d+))
      -捕获组1(由于最后一个参数设置为
      1
      ,其值将由
      str:regExCapture
      返回):
      • \\d+
        -1+位
      • (?:[.]\\d+{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}
,请参阅。因此,您也可以将命令编写为

 ${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)}