由于Java7正则表达式API提供了对命名捕获组的支持。方法java.util.regex.Matcher.group(String)返回由给定的命名捕获组捕获的输入子序列,但是在API文档中没有可用的示例。
在Java7中指定和检索命名捕获组的正确语法是什么?
发布于 2014-12-16 14:11:51
指定命名捕获组
使用以下具有单个捕获组的正则表达式作为示例([Pp]attern)。
下面是关于如何为上面的正则表达式指定named capturing group的4个示例:
(?<Name>[Pp]attern)
(?<group1>[Pp]attern)
(?<name>[Pp]attern)
(?<NAME>[Pp]attern)请注意,name of the capturing group必须严格匹配以下模式:
[A-Za-z][A-Za-z0-9]*组名区分大小写,因此在引用它们时必须指定确切的组名(见下文)。
正则表达式中命名捕获组的反向引用
在正则表达式中执行back-reference the content matched by a named capturing group (对应于上面的4个示例):
\k<Name>
\k<group1>
\k<name>
\k<NAME>命名捕获组仍然是编号的,因此在所有4个示例中,可以按照正常情况使用\1对其进行反向引用。
请参考替换字符串中的命名捕获组
To refer to the capturing group in replacement string (对应于上面的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中可以为不同的捕获组定义相同的名称,但目前在Java8中不支持。不同的采集组不能使用相同的名称。
命名捕获组相关接口
Matcher类中支持按组名检索捕获文本的新方法:
group(String name) (来自Java 7)start(String name) )(来自Java 8)end(String name)从Java8开始,MatchResult类中缺少相应的方法。针对此问题有一个正在进行的Enhancement request JDK-8065554。
当前没有API来获取regex中的命名捕获组列表。We have to jump through extra hoops to get it。尽管它在大多数情况下都是无用的,除了编写正则表达式测试程序。
发布于 2014-12-16 13:28:51
命名捕获组的新语法是(?<name>X),用于命名为"name“的匹配组X。以下代码捕获正则表达式(\w+) (任意一组字母数字字符组)。要命名此捕获组,必须添加表达式?就在要捕获的正则表达式之前的括号内。
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);此代码返回以下输出:
这是您指定的组:
https://stackoverflow.com/questions/27498106
复制相似问题