Java 7 中命名的捕获组支持的正则表达式

2022-09-02 01:11:24

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

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


答案 1

指定命名捕获组

将以下具有单个捕获组的正则表达式用作示例。([Pp]attern)

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

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

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

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

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

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

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

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

命名的捕获组仍然编号,因此在所有4个示例中,可以像往常一样对其进行反向引用。\1

引用替换字符串中的命名捕获组

引用替换字符串中的捕获组(对应于上面的 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 类中缺少相应的方法。对于此问题,有一个正在进行的增强功能请求 JDK-8065554

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


答案 2

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

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);

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

这是您的命名组: