我对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字段的RegEx - \scs1\=(.*?)\s\w+\=
cs2字段的RegEx - \scs2\=(.*?)\s\w+\=
使用上面的正则表达式和捕获组,我能够捕获数据值。但仅限于某些情况。因此,如果查看上面的日志条目,您会注意到日志条目中字段cs1
和cs2
的顺序不固定。因此有时cs1
字段出现在cs2
之前(在日志条目的中间),有时字段cs1
出现在日志条目的末尾(是最后一个字段) 。 cs2
字段也存在类似的行为。使用我当前的正则表达式仅在字段不是最后一个字段时才有效。
E.g。对于第一个日志输入行[blah, blah...] cs1=DataValue1 cs2=DataValue2
,我的正则表达式正确解析/提取cs1
字段的值但是cs2
字段失败,因为cs2
字段位于队伍的尽头。
同样,对于第二个日志输入行[blah, blah...] cs2=DataValue3 cs1=DataValue4
,我的正则表达式正确解析/提取cs2
字段的值但是它们无法提取cs1
字段的值,因为{ {1}}字段位于该行的末尾。
我的问题是 - 我的正则表达式应该是什么,以便它可以正确地解析/提取数据字段值,而不管该字段是出现在日志文件条目的中间还是末尾?
感谢任何帮助
此致
P.S。:如果有人有兴趣,我也会在QRadar论坛上发布这个问题(https://www.ibm.com/developerworks/community/forums/html/topic?id=f48bc2dc-2ccb-42df-b543-dc0522491fad),但没有任何回复......
答案 0 :(得分:2)
如果您不了解其排列顺序,只需使用预测即可捕获cs1
和cs2
字段的值。
^(?=.*?\scs1=(\S+))(?=.*\scs2=(\S+))
Java正则表达式,
^(?=.*?\\scs1=(\\S+))(?=.*\\scs2=(\\S+))
组索引1包含cs1
的值,索引2包含cs2
的值