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

时间:2014-12-16 05:28:51

标签: java regex java-7

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

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

2 个答案:

答案 0 :(得分:30)

指定命名捕获组

将以下正则表达式与单个捕获组一起使用作为示例([Pp]attern)

以下是有关如何为上述正则表达式指定named capturing group的4个示例:

(?<Name>[Pp]attern)
(?<group1>[Pp]attern)
(?<name>[Pp]attern)
(?<NAME>[Pp]attern)

请注意,name of the capturing group必须严格匹配以下模式:

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

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

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

正则表达式中的back-reference the content matched by a named capturing group(对应上面的4个示例):

\k<Name>
\k<group1>
\k<name>
\k<NAME>

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

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

refer to the capturing group in replacement string(对应上述4个示例):

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

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

COMMENT模式命名的捕获组

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

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

(?x)  (  ?<name>             [Pp] attern  )
(?x)  (  ?<  name  >         [Pp] attern  )
(?x)  (  ?<  n  a m    e  >  [Pp] attern  )

除了必须?<之外,它允许任意间距,即使在捕获组的名称之间也是如此。

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

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

命名捕获组相关API

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

从Java 8开始,MatchResult类缺少相应的方法。此问题正在进行Enhancement request JDK-8065554

目前没有API来获取正则表达式中命名捕获组的列表。 We have to jump through extra hoops to get it。虽然除了编写正则表达式测试器之外,它在大多数情况下都是无用的。

答案 1 :(得分:3)

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

Pattern compile = Pattern.compile("(?<teste>\\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);

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

  

这是您的命名组: