【问题标题】:Identifying capture groups in a Regex Pattern识别正则表达式模式中的捕获组
【发布时间】:2011-06-03 03:26:27
【问题描述】:

在 Java 中有没有办法(可能有一个额外的开源库)来识别 java.util.regex.Pattern 中的捕获组(即在创建匹配器之前)

Java 文档中的示例:

捕获组的编号为 计算他们的左括号 从左到右。在表达式中 ((A)(B(C))),例如,有 四个这样的组:

1         ((A)(B(C)))
2         (A)
3         (B(C))
4         (C)

原则上应该可以从(编译的)模式中识别这些。

更新: 从@Leniel 和 eslewhere 看来,这个工具(“命名组”)将在 2011 年中期出现在 Java 7 中。如果我等不及,我可以使用 jregex,尽管我不太确定 API 是什么。

【问题讨论】:

    标签: java regex capture-group


    【解决方案1】:

    您可以通过创建一个虚拟匹配器来找出组的个数,如下所示:

    Pattern p = Pattern.compile("((A)(B(C)))");
    System.out.println(p.matcher("").groupCount());
    

    如果您想要实际的子表达式(((A)(B(C)))(A) 等),那么不,该信息不可用。

    【讨论】:

    • 在您的示例中将没有匹配项。它是否仍然像已匹配一样报告匹配计数?匹配组是否为空?
    • groupCount() 只是告诉正则表达式中有多少个捕获组,因此如果您想在匹配后遍历捕获,您将知道(例如)要使用的最高组号被发现。它与 matches 的数量无关。如果您想知道正则表达式匹配给定字符串的次数,您只需重复调用find(),直到它返回false
    • 谢谢 - 这对我很有用。
    【解决方案2】:

    是的。检查这个:

    Regex Named Groups in Java

    【讨论】:

      猜你喜欢
      • 2019-09-27
      • 1970-01-01
      • 2019-01-06
      • 2018-03-11
      • 1970-01-01
      • 2022-12-04
      • 2021-06-01
      相关资源
      最近更新 更多