什么正则表达式将提取此字符串?

时间:2013-10-20 10:25:44

标签: java regex

问题

我有这个字符串:

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

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

first second third fourth

背景

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

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

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

3 个答案:

答案 0 :(得分: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
    }
 }
}

答案 1 :(得分:1)

假设randomtext不包含=,为什么不捕获以=开头并以空格结尾的所有内容 - 然后使用空格加入匹配数组以获取目标串...

/=([^ ]+) /

应该为您提供firstsecondthirdfourth

的数组

要使其成为包含=的随机文本的帐号,您可以执行...

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

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

答案 2 :(得分:0)

试试这个:

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

正如您可以看到this example,它对我有用。

正如您可以从here读取的那样,\K 会将文本与正则表达式匹配保留。

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

Cmd\w*AV=(\w+)

然后使用一些Matcher方法。