我有这个字符串:
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。
答案 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
不包含=
,为什么不捕获以=
开头并以空格结尾的所有内容 - 然后使用空格加入匹配数组以获取目标串...
/=([^ ]+) /
应该为您提供first
,second
,third
,fourth
要使其成为包含=
的随机文本的帐号,您可以执行...
/\bstrCmd(Arg)?=(.+?)\b/
...并使用第二个捕获组
答案 2 :(得分:0)
试试这个:
Cmd\w*AV=\K(\w+)
正如您可以看到this example,它对我有用。
正如您可以从here读取的那样,\K
会将文本与正则表达式匹配保留。
Java不支持\K
(正如您所说)。我能建议的最好(现在):
Cmd\w*AV=(\w+)
然后使用一些Matcher
方法。