当前位置: 首页 > 面试题库 >

Java 7中名为捕获组的正则表达式支持

全卜霸
2023-03-14
问题内容

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

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


问题答案:

指定命名的捕获组

将以下正则表达式与一个捕获组作为示例([Pp]attern)

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

(?<Name>[Pp]attern)
(?<group1>[Pp]attern)
(?<name>[Pp]attern)
(?<NAME>[Pp]attern)

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

[A-Za-z][A-Za-z0-9]*

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

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

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

\k<Name>
\k<group1>
\k<name>
\k<NAME>

命名的捕获组仍被编号,因此在所有四个示例中,可以\1按常规使用反向引用。

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

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

${Name}
${group1}
${name}
${NAME}

与上述相同,在所有四个示例中,可以$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中可以为不同的捕获组定义相同的名称,但Java(Java 8)当前 不支持
该名称。不同的捕获组不能使用相同的名称。

命名与捕获组相关的API

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

  • group(String name) (来自Java 7)
  • start(String name)(来自 Java 8
  • end(String name)(来自 Java 8

MatchResultJava
8开始,类中缺少相应的方法。针对此问题,存在正在进行的增强请求JDK-8065554。

当前尚无API可以获取正则表达式中命名捕获组的列表。我们必须跳过额外的障碍才能做到。尽管对于编写大多数正则表达式来说是没有用的,但除了编写正则表达式测试器之外。



 类似资料:
  • 假设我有这个虚拟URL,我需要提取植物及其颜色作为 下面的I have正在按预期捕获我需要的元素,但是当我的URL中的植物少于4株时,它无法捕获任何东西。底部有一个指向regex测试员的链接,其中有示例代码和URL,您可以使用。 如何修改这个正则表达式,使其动态工作,从而在不需要静态URL结构的情况下捕获可用内容。现在,假设我最多只能捕获4株植物(8组) https://regex101.com/

  • 在Python中,如何在非捕获组中捕获组?换句话说,如何重复包含捕获组的非捕获子模式? 例如,捕获导入字符串上的所有包名。例如,字符串: 导入熊猫、操作系统、系统 将返回“pandas”、“os”和“sys”。下面的模式捕获第一个包并到达第二个包: 从这里,我想重复捕获组并匹配以下字符的子模式,即。当我用一个非捕获组包围这个子模式并重复它时: 它不再捕捉里面的群体。

  • 问题内容: 据我所知,JavaScript中没有所谓的捕获组。获得类似功能的替代方法是什么? 问题答案: ECMAScript 2018将命名捕获组引入了JavaScript正则表达式中。 例: 如果您需要支持较旧的浏览器,则可以使用命名捕获组来处理普通(编号)捕获组,而只需要跟踪编号-如果捕获组中的捕获组顺序很麻烦,正则表达式更改。 我能想到的命名捕获组只有两个“结构”优点: 在某些正则表达式中

  • 问题内容: 我正在尝试使用Java expr在:之后捕获正确的部分,但是在以下代码中,打印的捕获组是整个字符串,怎么了? 问题答案: 子组的编号从1开始,全文为0。只需循环执行count + 1。

  • 问题内容: 有什么方法可以用捕获组的已修改内容替换正则表达式? 例: 我想用$ 1乘以3代替所有出现的情况。 编辑: 看起来好像出了点问题:( 如果我用 引发IllegalStateException:找不到匹配项 但 工作正常,但我不能更改$ 1 :( 问题答案: 要获得第一场比赛,请使用。之后,你可以用来引用此第一个匹配项,并将所有匹配项替换为第一个匹配值乘以3。 如果你想将每个匹配项替换为该

  • 问题内容: 在这个答案中,我建议使用 但是两个人抱怨结果包含字符串“ null”,例如。这可以通过(即)being 来解释,可以通过转换为字符串“ null”。但是,我总是得到空字符串。我的测试用例涵盖了 通过。确切的行为是否未定义? 问题答案: 当替换字符串中指定了一个不捕获任何内容的捕获组()时,参考实现中的Matcher类的文档未指定方法的行为。尽管方法的行为很明确,但方法中没有任何提及。