我有一个关于Java正则表达式和捕获组的问题。我的目标是解析日志文件并将相关字段提取到QRadar中。但是,由于QRadar使用Java正则表达式来解析日志文件,而且由于我的问题是正则表达式问题,所以我在这里发布它,希望得到一些关于我的问题的指针/解决方案。
我的问题来了-
我试图解析一个日志文件,它是一个CEF (公共事件格式)格式化的日志文件。以下是日志文件中的几行-
[blah, blah...] cs1=DataValue1 cs2=DataValue2
[blah, blah...] cs2=DataValue3 cs1=DataValue4我的目标是从上面的行中提取字段cs1和cs2的数据值。因此,我对从上面的行捕获值DataValue1、DataValue2、DataValue3和DataValue4感兴趣。
我想出了以下正则表达式来完成同样的任务-
RegEx for cs1 field - \scs1\=(.*?)\s\w+\=
RegEx for cs2 field - \scs2\=(.*?)\s\w+\=
使用上面的正则表达式和捕获组,我能够捕获数据值。但只有在某些情况下。因此,如果您查看上面的日志条目,您将注意到日志条目中的字段cs1和cs2的顺序并不固定。因此,有时cs1字段出现在cs2之前(在日志条目的中间),而在其他时候,字段cs1出现在日志条目的末尾(是最后一个字段)。cs2字段也存在类似的行为。只有当字段不是最后一个字段时,才能使用当前正则表达式。
例如,对于第一个日志条目行[blah, blah...] cs1=DataValue1 cs2=DataValue2,我的正则表达式正确地解析/提取了cs1字段的值,但是对于cs2字段,它们失败了,因为cs2字段位于行的末尾。
类似地,对于第二个日志条目行[blah, blah...] cs2=DataValue3 cs1=DataValue4,我的正则表达式正确地解析/提取了cs2字段的值,但是它们无法提取cs1字段的值,因为cs1字段位于行的末尾。
我的问题是-我的正则表达式应该是什么,以便它能够正确地解析/提取数据字段值,而不管字段是出现在日志文件条目的中间还是末尾?
任何帮助都是非常感谢的。
致以敬意,
P.S.:如果有人感兴趣的话,我也在QRadar论坛(https://www.ibm.com/developerworks/community/forums/html/topic?id=f48bc2dc-2ccb-42df-b543-dc0522491fad)上发布了这个问题,但还没有收到任何回复.
发布于 2014-10-15 05:30:01
如果您不知道cs1和cs2字段的排列顺序,只需使用前瞻性来捕获它的值。
^(?=.*?\scs1=(\S+))(?=.*\scs2=(\S+))Java正则表达式是,
^(?=.*?\\scs1=(\\S+))(?=.*\\scs2=(\\S+))组索引1包含cs1的值,索引2包含cs2的值。
https://stackoverflow.com/questions/26374973
复制相似问题