java - 流集中的正则表达式
问题描述
嗨,我想使用 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)}
请参阅正则表达式演示。
细节
^
- 字符串的开始(?:.*?(\\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)}
查看另一个正则表达式演示。
推荐阅读
- jquery - Jquery 函数内部不执行算术运算
- angular - NullInjectorError:没有 HttpClient 的提供者(已导入)
- html - 显示货币时如何返回 2 位小数的 Ruby 浮点数
- vue.js - $.parent 与发出和监听事件的性能比较
- javascript - d3 创建一个缺少数据点的面积图,并且定义()不起作用
- sql - 将表情符号插入 SQL Server
- django - 为什么我可以在不定义所有非空字段的情况下保存 django 模型实例
- java - Apache Kafka 性能测试工具
- xml - Linux - bash脚本从文件中删除同一行之前的每一行
- c# - Task.Wait 不等待异步方法完成