指定命名的捕获组
将以下正则表达式与一个捕获组作为示例
([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>
命名的捕获组仍被编号,因此在所有四个示例中,可以
1按常规使用反向引用。
请参考替换字符串中的命名捕获组
要在替换字符串中引用捕获组(对应于上面的4个示例):
${Name}${group1}${name}${NAME}与上述相同,在所有四个示例中,可以
$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类中的新方法支持按组名检索捕获的文本:
group(String name)
(来自Java 7)start(String name)
(来自 Java 8 )end(String name)
(来自 Java 8 )
从
MatchResultJava
8开始,类中缺少相应的方法。针对此问题,存在正在进行的增强请求JDK-8065554。
当前尚无API可以获取正则表达式中命名捕获组的列表。我们必须跳过额外的障碍才能做到。尽管对于编写大多数正则表达式来说是没有用的,但除了编写正则表达式测试器之外。



