【问题标题】:Regular expression to parse option string正则表达式解析选项字符串
【发布时间】:2009-02-05 03:16:31
【问题描述】:

我正在使用 Java 匹配器来尝试匹配以下内容:

@tag TYPE_WITH_POSSIBLE_SUBTYPE -PARNAME1=PARVALUE1 -PARNAME2=PARVALUE2: MESSAGE

TYPE_WITH_POSSIBLE_SUBTYPE 由带句点的字母组成。

每个参数都必须由字母组成,每个值都必须由数字/字母组成。可以有 0 个或多个参数。 紧跟在最后一个参数值之后的是分号、一个空格,其余的被认为是消息。

一切都需要分组。

我当前的正则表达式(作为 Java 文字)是:

(@tag)[\\s]+?([\\w\\.]*?)[\\s]*?(-.*=.*)*?[\\s]*?[:](.*)

但是,我一直将所有参数作为一组。如果可能的话,我如何将每个人作为一个单独的组?

我不太会使用正则表达式,所以我总是搞砸一些事情。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    如果要分别捕获每个参数,则必须为每个参数设置一个捕获组。当然,你不能这样做,因为你不知道会有多少参数。我推荐一种不同的方法:

    Pattern p = Pattern.compile("@tag\\s+([^:]++):\\s*(.*)");
    Matcher m = p.matcher(s);
    if (m.find())
    {
      String[] parts = m.group(1).split("\\s+");
      for (String part : parts)
      {
        System.out.println(part);
      }
    }
    System.out.printf("message: %s%n", m.group(2));
    

    数组中的第一个元素是您的 TYPE 名称,其余的(如果有的话)是参数。

    【讨论】:

    • 谢谢。我现在实际上有类似的东西(我在其中拆分参数,但我希望有一种方法可以最终得到可变长度组......
    • 据我所知,.NET 是唯一一种允许您访问捕获组的所有匹配项的正则表达式风格,而不仅仅是最后一个。
    【解决方案2】:

    试试这个(您可能需要添加额外的 '\' 以使其在字符串中工作。

    (@tag)\s*(\w*)\s*(-[\w\d]*=[\w\d]*\s*)*:(.*)
    

    顺便说一句,我强烈推荐这个网站来帮助你构建正则表达式:RegexPal。或者更好的是RegexBuddy;如果你打算在未来做很多正则表达式,这 40 美元是值得的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多