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在替换字符串中引用捕获组的内容.
使用(?<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)目前不支持它.您不能对不同的捕获组使用相同的名称.
Matcher类中的新方法,支持按组名检索捕获的文本:
group(String name) (来自Java 7)start(String name)(来自Java 8)end(String name)(来自Java 8)从MatchResultJava 8开始,类中缺少相应的方法.此问题有一个正在进行的增强请求JDK-8065554.
目前没有API来获取正则表达式中命名捕获组的列表.我们必须通过额外的箍来获得它.虽然它对大多数用途来说都是无用的,除了编写正则表达式测试器.