正则表达式和捕获组

时间:2014-10-15 05:17:11

标签: java regex

我对Java正则表达式和捕获组有疑问。我的目标是解析日志文件并将相关字段提取到QRadar中。我不是在编写Java代码,但是因为QRadar使用Java正则表达式来解析日志文件,因为我的问题是正则表达式问题,我在这里发布它是为了获得一些指针/解决我的问题。

这是我的问题 -

我正在尝试解析一个CEF(公共事件格式)格式的日志文件的日志文件。以下是日志文件中的几行 -

[blah, blah...] cs1=DataValue1 cs2=DataValue2

[blah, blah...] cs2=DataValue3 cs1=DataValue4

我的目标是从上面的行中提取字段cs1cs2的数据值。所以我有兴趣从以上几行中捕捉价值观DataValue1DataValue2DataValue3DataValue4

我提出了以下正则表达式来实现相同的目标 -

cs1字段的RegEx - \scs1\=(.*?)\s\w+\=

cs2字段的RegEx - \scs2\=(.*?)\s\w+\=

使用上面的正则表达式和捕获组,我能够捕获数据值。但仅限于某些情况。因此,如果查看上面的日志条目,您会注意到日志条目中字段cs1cs2的顺序不固定。因此有时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),但没有任何回复......

1 个答案:

答案 0 :(得分:2)

如果您不了解其排列顺序,只需使用预测即可捕获cs1cs2字段的值。

^(?=.*?\scs1=(\S+))(?=.*\scs2=(\S+))

Java正则表达式,

^(?=.*?\\scs1=(\\S+))(?=.*\\scs2=(\\S+))

DEMO

组索引1包含cs1的值,索引2包含cs2的值