首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式和捕获组

正则表达式和捕获组
EN

Stack Overflow用户
提问于 2014-10-15 05:17:11
回答 1查看 2K关注 0票数 1

我有一个关于Java正则表达式和捕获组的问题。我的目标是解析日志文件并将相关字段提取到QRadar中。但是,由于QRadar使用Java正则表达式来解析日志文件,而且由于我的问题是正则表达式问题,所以我在这里发布它,希望得到一些关于我的问题的指针/解决方案。

我的问题来了-

我试图解析一个日志文件,它是一个CEF (公共事件格式)格式化的日志文件。以下是日志文件中的几行-

代码语言:javascript
复制
[blah, blah...] cs1=DataValue1 cs2=DataValue2

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

我的目标是从上面的行中提取字段cs1cs2的数据值。因此,我对从上面的行捕获值DataValue1DataValue2DataValue3DataValue4感兴趣。

我想出了以下正则表达式来完成同样的任务-

RegEx for cs1 field - \scs1\=(.*?)\s\w+\=

RegEx for cs2 field - \scs2\=(.*?)\s\w+\=

使用上面的正则表达式和捕获组,我能够捕获数据值。但只有在某些情况下。因此,如果您查看上面的日志条目,您将注意到日志条目中的字段cs1cs2的顺序并不固定。因此,有时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)上发布了这个问题,但还没有收到任何回复.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-15 05:30:01

如果您不知道cs1cs2字段的排列顺序,只需使用前瞻性来捕获它的值。

代码语言:javascript
复制
^(?=.*?\scs1=(\S+))(?=.*\scs2=(\S+))

Java正则表达式是,

代码语言:javascript
复制
^(?=.*?\\scs1=(\\S+))(?=.*\\scs2=(\\S+))

演示

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26374973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档