我对Java正则表达式和捕获组有疑问。我的目标是解析日志文件并将相关字段提取到QRadar中。我不是完全在编写Java代码,但是因为QRadar使用Java正则表达式来解析日志文件,并且由于我的问题是正则表达式问题,所以我将其发布在这里,希望能得到一些指向我的问题的指针/解决方案。
这是我的问题-
我正在尝试分析CEF(通用事件格式)格式的日志文件。以下是日志文件中的几行-
[blah, blah...] cs1=DataValue1 cs2=DataValue2
[blah, blah...] cs2=DataValue3 cs1=DataValue4
我的目标是从上述各行中提取字段
cs1
和cs2
的数据值。所以我有兴趣从上面几行中捕获值-DataValue1
,DataValue2
,DataValue3
和DataValue4
我想出以下正则表达式来实现相同目的-
CS1字段的正则表达式-
\scs1\=(.*?)\s\w+\=
RegEx for CS2字段-
\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
字段的值。线。我的问题是-我的正则表达式应该是什么,以便它可以正确解析/提取数据字段值,而不管该字段是出现在日志文件条目的中间还是结尾?
任何帮助表示赞赏
问候,
附注:如果有人有兴趣,我也将这个问题也发布在QRadar论坛(https://www.ibm.com/developerworks/community/forums/html/topic?id=f48bc2dc-2ccb-42df-b543-dc0522491fad)上,但是还没有任何回应。
最佳答案
如果您不知道其排列顺序,只需使用前瞻性捕获cs1
和cs2
字段的值即可。
^(?=.*?\scs1=(\S+))(?=.*\scs2=(\S+))
Java正则表达式将是
^(?=.*?\\scs1=(\\S+))(?=.*\\scs2=(\\S+))
DEMO
组索引1包含
cs1
的值,而索引2包含cs2
的值