1

问题

我有这个字符串:

field1=text, CmdSet=[ CmdAV=first CmdArgAV=second CmdArgAV=third CmdArgAV=fourth ], field2=text

是否可以编写一个正则表达式(一行)来捕获匹配组中的以下内容?

first second third fourth

背景

这是来自 Cisco ACS 设备的系统日志事件。SIEM 解决方案正在接收该事件。这个 SIEM 解决方案允许我们使用正则表达式通过匹配组从日志中“提取”信息。我们通过在输入字段中输入“正则表达式”行来做到这一点。因此,例如,如果我想提取CmdAV字段的值,我会这样做CmdAV\=(.*?)\sCmdArgAV,并告诉它使用“匹配组 1”(无论如何这是唯一的组)。但是,我想在我的问题中提取的“信息”分散成一个CmdAV和几个CmdArgAV.

大声思考,也许可以编写一个正则表达式来匹配CmdAV=and之间的所有内容], field=text,然后“删除” CmdArgAV=.

这个 SIEM 解决方案的文档指向这一点:http ://docs.oracle.com/javase/tutorial/essential/regex/有关正则表达式的更多信息,所以我猜它使用 Java。

4

3 回答 3

1

试试这个......它应该工作:

public class Test{
 public static void main(String []args){
     String str = "field1=text, CmdSet=[ CmdAV=first CmdArgAV=second CmdArgAV=third CmdArgAV=fourth ], field2=text";
    Pattern p = Pattern.compile("Cmd\\w*=(\\w+)");
    Matcher m =  p.matcher(str);
    while (m.find()) {
        System.out.println(m.group(1)); // first, second, third, fourth
    }
 }
}
于 2013-10-20T10:27:35.450 回答
1

假设randomtext不包括=,为什么不捕获以 a 开头=并以空格结尾的所有内容 - 然后将匹配数组与空格连接以获取目标字符串...

/=([^ ]+) /

应该给你数组first, second, third,fourth

要使其考虑包含 的随机文本=,您可以这样做...

/\bstrCmd(Arg)?=(.+?)\b/

...并使用第二个捕获组

于 2013-10-20T10:30:59.797 回答
0

试试这个:

Cmd\w*AV=\K(\w+)

正如您在此示例中看到的那样,它对我有用。

正如您可以从这里读到的那样,\K 将文本保持在正则表达式匹配之外

Java\K不支持不幸的是(如您所说)。我能建议的最好的(现在)是这样的:

Cmd\w*AV=(\w+)

然后使用一些Matcher方法。

于 2013-10-20T11:02:52.237 回答