首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式命名捕获组在Java 7中的支持

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

Stack Overflow用户
提问于 2014-12-16 13:28:51
回答 2查看 16.4K关注 0票数 22

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-16 14:11:51

指定命名捕获组

使用以下具有单个捕获组的正则表达式作为示例([Pp]attern)

下面是关于如何为上面的正则表达式指定named capturing group的4个示例:

代码语言:javascript
复制
(?<Name>[Pp]attern)
(?<group1>[Pp]attern)
(?<name>[Pp]attern)
(?<NAME>[Pp]attern)

请注意,name of the capturing group必须严格匹配以下模式:

代码语言:javascript
复制
[A-Za-z][A-Za-z0-9]*

组名区分大小写,因此在引用它们时必须指定确切的组名(见下文)。

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

在正则表达式中执行back-reference the content matched by a named capturing group (对应于上面的4个示例):

代码语言:javascript
复制
\k<Name>
\k<group1>
\k<name>
\k<NAME>

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

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

To refer to the capturing group in replacement string (对应于上面的4个示例):

代码语言:javascript
复制
${Name}
${group1}
${name}
${NAME}

同上,在所有4个示例中,都可以通过替换字符串中的$1来引用捕获组的内容。

COMMENT模式下的命名捕获组

使用(?<name>[Pp]attern)作为本节的示例。

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

代码语言:javascript
复制
(?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。尽管它在大多数情况下都是无用的,除了编写正则表达式测试程序。

票数 32
EN

Stack Overflow用户

发布于 2014-12-16 13:28:51

命名捕获组的新语法是(?<name>X),用于命名为"name“的匹配组X。以下代码捕获正则表达式(\w+) (任意一组字母数字字符组)。要命名此捕获组,必须添加表达式?就在要捕获的正则表达式之前的括号内。

代码语言:javascript
复制
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);

此代码返回以下输出:

这是您指定的组:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27498106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档