Java 正则表达式捕获组索引

2022-08-31 08:57:03

我有以下行,

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. 正则表达式模式包含一个,那么为什么结果省略了它呢?组 1 是否检测括号内的所有单词?:group(1)

  3. 那么,如果我再加上两个括号,例如:那么,会有两个组吗? 将退回零件并退回零件?\\s*(\d*)(.*)group(1)(\d*)group(2)(.*)

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


答案 1

捕获和分组

捕获组创建具有捕获属性的(pattern)

您可能经常看到(和使用)的一个相关组是 ,它创建一个不捕获属性的,因此称为非捕获组(?:pattern)

当您需要重复一系列模式时,通常使用组,例如,或指定交替应在哪里生效,例如 (, then or , then ) vs. ( or )。(\.\w+)+^(0*1|1*0)$^0*11*0$^0*1|1*0$^0*11*0$

除了分组之外,捕获组还将记录捕获组内与模式匹配的文本。使用您的示例 , 匹配和匹配 ,并且由于在捕获组内,因此为捕获组 1 记录文本。(pattern)(.*):.*ABC::.*(.*)ABC

组号

整个模式定义为组编号 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 中,您可以定义一个命名的捕获组 ,并且可以访问与 Matcher.group(字符串名称)匹配的内容。正则表达式更长,但代码更有意义,因为它指示您尝试与正则表达式匹配或提取的内容。(?<name>pattern)

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

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

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


答案 2

对于我们其他人

下面是一个简单明了的示例:


正则表达式: ( G1 )( G2 )( G3 )( G4 )( G5 )([a-zA-Z0-9]+)([\s]+)([a-zA-Z ]+)([\s]+)([0-9]+)

字符串:"!* UserName10 John Smith 01123 *!"

group(0): UserName10 John Smith 01123
group(1): UserName10
group(2):  
group(3): John Smith
group(4):  
group(5): 01123

如您所见,我创建了五个组,每个组都括在括号中。

我包括了!*和*!在两侧,使其更清晰。请注意,这些字符都不在正则表达式中,因此不会在结果中生成。Group(0) 只给你整个匹配的字符串(我所有的搜索条件都在一行中)。组 1 在第一个空格之前停止,因为空格字符未包含在搜索条件中。组 2 和组 4 只是空格,在本例中实际上是一个空格字符,但也可以是制表符或换行符等。第3组包括空间,因为我把它放在搜索条件中...等。

希望这是有道理的。