gpt4 book ai didi

Java 正则表达式捕获组索引

转载 作者:IT老高 更新时间:2023-10-28 11:21:14 24 4
gpt4 key购买 nike

我有以下行,

typeName="ABC:xxxxx;";

我需要获取单词ABC

我写了以下代码片段,

Pattern pattern4=Pattern.compile("(.*):");
matcher=pattern4.matcher(typeName);

String nameStr="";
if(matcher.find())
{
nameStr=matcher.group(1);

}

所以如果我放 group(0) 我得到 ABC: 但如果我放 group(1) 它是 ABC ,所以我想知道

  1. 这个01是什么意思?如果有人能用很好的例子解释我会更好。

  2. 正则表达式模式中包含一个 :,那么为什么 group(1) 结果会忽略它呢?第 1 组是否检测到括号内的所有单词?

  3. 那么,如果我再放两个括号,例如 \\s*(\d*)(.*): 那么,会有两组吗? group(1) 将返回 (\d*) 部分,group(2) 返回 (.*)部分?

提供代码片段的目的是为了消除我的困惑。这不是我正在处理的代码。上面给出的代码可以用 String.split() 以更简单的方式完成。

最佳答案

捕获和分组

捕获组 (pattern)创建一个具有 capturing 属性的 group

您可能经常看到(和使用)的相关一个是(?:pattern) ,它创建了一个没有 capturing 属性的 group,因此命名为 non-capturing group

当您需要重复一系列模式时,通常使用组,例如(\.\w+)+ ,或指定更改应在何处生效,例如^(0*1|1*0)$ ( ^ ,然后是 0*11*0 ,然后是 $ )与 ^0*1|1*0$ (^0*11*0$)。

一个捕获组,除了分组,还会记录捕获组内模式匹配的文本(pattern) .使用您的示例,(.*): , .*匹配 ABC:匹配 : ,并且因为 .*在捕获组内 (.*) , 正文 ABC为捕获组 1 记录。

组号

整个模式定义为组号0。

模式中的任何捕获组都从 1 开始索引。索引由捕获组的左括号的顺序定义。例如,以下是 所有 5 个捕获组,采用以下模式:

(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
| | | | | | || | |
1-----1 | | 4------4 |5-------5 |
| 3---------------3 |
2-----------------------------------------2

组号用于反向引用 \n在模式和 $n在替换字符串中。

在其他正则表达式风格(PCRE、Perl)中,它们也可用于子例程调用

您可以通过 Matcher.group(int group) 访问特定组匹配的文本.组号可以按照上述规则进行识别。

在某些正则表达式(PCRE、Perl)中,有一个分支重置功能,允许您使用相同的数字捕获组在不同的交替分支中

组名

从 Java 7 开始,您可以定义 named capturing group (?<name>pattern) ,您可以访问与 Matcher.group(String name) 匹配的内容.正则表达式更长,但代码更有意义,因为它指示您尝试使用正则表达式匹配或提取的内容。

组名用于反向引用 \k<name>在模式和 ${name}在替换字符串中。

命名的捕获组仍然使用相同的编号方案进行编号,因此也可以通过 Matcher.group(int group) 访问它们.

在内部,Java 的实现只是从名称映射到组号。因此,您不能为 2 个不同的捕获组使用相同的名称。

关于Java 正则表达式捕获组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16517689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com