java - 流集中的正则表达式

标签 java regex streamsets

您好,我想使用 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 吗?

最佳答案

你可以使用

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

参见 regex demo .

详情

  • ^ - 字符串的开始
  • (?:.*?(\\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} , 请参阅 Extract ip addresses from Strings using regex .所以,你也可以把命令写成

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

参见 another regex demo .

关于java - 流集中的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52664677/

相关文章:

java - if/else 语句,else 每次都会打印

Java 8 对多个对象进行排序

xml - CDATA 的正则表达式是什么

正则表达式随后捕获字符之前的第一个单词 - Postgresql

java - 如何将自定义处理器添加到StreamSet

java - 公共(public)方法返回私有(private)类实例怎么样?

java - Spring Boot中使用nginx代理websocket时出现CORS错误

javascript - 正则表达式不适用于 IE,但适用于其他浏览器

kubernetes - 无法通过 K8s 上的 URL 访问 StreamSet