在Java 7中,正则表达式命名为捕获组支持

由于Java 7正则表达式API提供了对命名捕获组的支持。 方法java.util.regex.Matcher.group(String)返回由给定的命名捕获组捕获的输入子序列,但API文档中没有可用的示例。

在Java 7中指定和检索命名捕获组的正确语法是什么?

指定命名捕获组

以单个捕获组为例([Pp]attern)使用以下正则表达式。

以下是有关如何为上述正则表达式指定命名捕获组的 4个示例:

 (?[Pp]attern) (?[Pp]attern) (?[Pp]attern) (?[Pp]attern) 

请注意, 捕获组的名称必须严格匹配以下模式:

 [A-Za-z][A-Za-z0-9]* 

组名称区分大小写,因此您在引用它们时必须指定确切的组名称(请参阅下文)。

反向引用正则表达式中的命名捕获组

要在正则表达式中反向引用由命名捕获组匹配的内容 (对应于上面的4个示例):

 \k \k \k \k 

指定的捕获组仍然编号,因此在所有4个示例中,它可以按照正常情况以\1反向引用。

请参阅替换字符串中的命名捕获组

在替换字符串中引用捕获组 (对应于上面的4个示例):

 ${Name} ${group1} ${name} ${NAME} 

与上面相同,在所有4个示例中,可以在替换字符串中以$1引用捕获组的内容。

在COMMENT模式下命名捕获组

使用(?[Pp]attern)作为本节的示例。

Oracle的COMMENT模式(嵌入式标志(?x) )的实现解析以下示例与上面的正则表达式相同:

 (?x) ( ? [Pp] attern ) (?x) ( ?< name > [Pp] attern ) (?x) ( ?< name > [Pp] attern ) 

除了必须分开的?< ,即使在捕获组的名称之间也允许任意间距。

不同捕获组的名称相同吗?

虽然在.NET,Perl和PCRE中可以为不同的捕获组定义相同的名称,但Java(Java 8)目前不支持它。 您不能对不同的捕获组使用相同的名称。

命名捕获组相关的API

Matcher类中的新方法,支持按组名检索捕获的文本:

  • group(String name) (来自Java 7)
  • start(String name) (来自Java 8
  • end(String name) (来自Java 8

自Java 8开始, MatchResult类中缺少相应的方法。此问题有一个正在进行的增强请求JDK-8065554 。

目前没有API来获取正则表达式中命名捕获组的列表。 我们必须通过额外的箍来获得它 。 虽然除了编写正则表达式测试程序之外,它对于大多数目的来说都是无用的。

对于由“name”命名的匹配组X,命名捕获组的新语法是(?X) 。 以下代码捕获正则表达式(\ w +)(任何一组字母数字字符)。 要命名此捕获组,您必须添加表达式? 就在捕获正则表达式之前的括号内。

 Pattern compile = Pattern.compile("(?\\w+)"); Matcher matcher = compile.matcher("The first word is a match"); matcher.find(); String myNamedGroup= matcher.group("teste"); System.out.printf("This is yout named group: %s", myNamedGroup); 

此代码返回打印以下输出:

这是你的命名组:The