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

Raf*_*rja 19 java regex java-7

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

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

nha*_*tdh 30

指定命名捕获组

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

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

(?<Name>[Pp]attern)
(?<group1>[Pp]attern)
(?<name>[Pp]attern)
(?<NAME>[Pp]attern)
Run Code Online (Sandbox Code Playgroud)

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

[A-Za-z][A-Za-z0-9]*
Run Code Online (Sandbox Code Playgroud)

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

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

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

\k<Name>
\k<group1>
\k<name>
\k<NAME>
Run Code Online (Sandbox Code Playgroud)

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

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

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

${Name}
${group1}
${name}
${NAME}
Run Code Online (Sandbox Code Playgroud)

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

COMMENT模式下命名捕获组

使用(?<name>[Pp]attern)作为该部分的示例.

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

(?x)  (  ?<name>             [Pp] attern  )
(?x)  (  ?<  name  >         [Pp] attern  )
(?x)  (  ?<  n  a m    e  >  [Pp] attern  )
Run Code Online (Sandbox Code Playgroud)

除非?<必须其分开,否则即使在捕获组的名称之间也允许任意间距.

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

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

命名捕获组相关的API

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

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

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