【问题标题】:What regex expression will extract this string?什么正则表达式会提取这个字符串?
【发布时间】:2013-10-20 10:25:44
【问题描述】:

问题

我有这个字符串:

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= 和], field=text 之间的所有内容,然后“删除”CmdArgAV= 的任何实例。

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

【问题讨论】:

    标签: java regex


    【解决方案1】:

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

    /=([^ ]+) /
    

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

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

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

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

    【讨论】:

    • 它不起作用。我编辑了我的问题;很抱歉之前没有正确的字符串。我解释了这个变化,是的,randomtext 确实包括=。我做了\bCmd(Arg)?AV=(.+)\b,但它捕获了第一个 CmdArgAV 之后的所有内容,直到整个日志结束。
    • 对不起 - 应该是 (.+?) 而不是 (.+) 以使捕获不贪婪,并尽可能少消耗
    【解决方案2】:

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

    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
        }
     }
    }
    

    【讨论】:

    • strCmd\w*=([^ ]+) 也捕捉第一个
    • @RedAlert:对!非常感谢! :)
    • 它不起作用。我编辑了我的问题;很抱歉之前没有正确的字符串。我解释了变化。我做了Cmd\w*AV=([^ ]+),但它只捕获first,而不是其他人。 CmdArgAV=([^ ]+) 也只捕获 second。我认为这是应用程序的限制,因为您的建议在这里有效:gskinner.com/RegExr。会不会是这个原因?
    • @user278064 不,仍然不起作用。它只捕获first。不过,这适用于 gskinner.com。我不知道“API”和所有这些,但这可能是因为应用程序正在使用Java API,或者他们没有考虑到有人做这样的事情(即没有充分利用 API)?
    • @user278064 Cmd\\w*=(\\w+) 也不起作用。它不匹配任何东西。为了给你一个想法,我输入的窗口是这样的:i.imgur.com/vODlepk.jpg。当我输入正则表达式时,它会突出显示它。由于你在这里给我的所有正则表达式都在 gskinner.com 上工作,我开始觉得我正在使用的工具需要改变一些东西。在 gskinner 上,如果我关闭“全局”(/g),它只会捕获第一部分,并且行为与我正在经历的完全一样,所以我使用的工具没有启用“全局”。这听起来像是一个合理的解释吗?
    【解决方案3】:

    试试这个:

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

    正如您在 this example 中看到的那样,它对我有用。

    正如您从 here 中看到的那样,\K 将文本排除在正则表达式匹配之外。

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

    Cmd\w*AV=(\w+)
    

    然后使用一些Matcher 方法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2014-08-25
    相关资源
    最近更新 更多