在Java 7中,正则表达式命名为捕获组支持
由于Java 7正则表达式API提供了对命名捕获组的支持。 方法java.util.regex.Matcher.group(String)返回由给定的命名捕获组捕获的输入子序列,但API文档中没有可用的示例。
在Java 7中指定和检索命名捕获组的正确语法是什么?
指定命名捕获组
以单个捕获组为例([Pp]attern)
使用以下正则表达式。
以下是有关如何为上述正则表达式指定命名捕获组的 4个示例:
(?[Pp]attern) (?[Pp]attern) (?[Pp]attern) (? [Pp]attern)
请注意, 捕获组的名称必须严格匹配以下模式:
[A-Za-z][A-Za-z0-9]*
组名称区分大小写,因此您在引用它们时必须指定确切的组名称(请参阅下文)。
反向引用正则表达式中的命名捕获组
要在正则表达式中反向引用由命名捕获组匹配的内容 (对应于上面的4个示例):
\k \k \k \k
指定的捕获组仍然编号,因此在所有4个示例中,它可以按照正常情况以\1
反向引用。
请参阅替换字符串中的命名捕获组
在替换字符串中引用捕获组 (对应于上面的4个示例):
${Name} ${group1} ${name} ${NAME}
与上面相同,在所有4个示例中,可以在替换字符串中以$1
引用捕获组的内容。
在COMMENT模式下命名捕获组
使用(?
作为本节的示例。
Oracle的COMMENT
模式(嵌入式标志(?x)
)的实现解析以下示例与上面的正则表达式相同:
(?x) ( ? [Pp] attern ) (?x) ( ?< name > [Pp] attern ) (?x) ( ?< name > [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 )
自Java 8开始, MatchResult
类中缺少相应的方法。此问题有一个正在进行的增强请求JDK-8065554 。
目前没有API来获取正则表达式中命名捕获组的列表。 我们必须通过额外的箍来获得它 。 虽然除了编写正则表达式测试程序之外,它对于大多数目的来说都是无用的。
对于由“name”命名的匹配组X,命名捕获组的新语法是(?
。 以下代码捕获正则表达式(\ w +)(任何一组字母数字字符)。 要命名此捕获组,您必须添加表达式? 就在捕获正则表达式之前的括号内。
Pattern compile = Pattern.compile("(?\\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);
此代码返回打印以下输出:
这是你的命名组:The
- 如何将“级别”分配给非循环有向图的顶点?
- 如何处理RxJava中观察者的onNext引发的exception?
- 使用Struts 2和Hibernate的分页
- 何时在Jersey资源中使用@Singleton
- JAX-RS中QueryParam和MatrixParam有什么区别?
- MongoDB Java插入引发org.bson.codecs.configuration.CodecConfigurationException:找不到类io.github.ilkgunel.mongodb.Pojo的编解码器
- 在try \ finally块中是否存在这样的情况,finally将不会被执行?
- 使用ClientRegionShortcut.PROXY以编程方式控制Gemfire区域的入门时间
- Javagenerics – 获取实际类型的generics参数