Java 正则表达式捕获组索引

我有以下几句话,

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()以一种更简单的方式来完成。

125140 次浏览

括号 ()用于启用正则表达式短语的分组。

group(1)包含括号 (.*)之间的字符串,因此在本例中是 .*

group(0)包含整个匹配的字符串。

如果需要更多的组(读取 (...)) ,它将被放入具有下一个索引(2、3等)的组中。

捕获并分组

捕获组 (pattern)创建一个具有 捕捉属性的 小组

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

当你需要重复一系列的模式,例如 (\.\w+)+,或者指定交替在哪里生效,例如 ^(0*1|1*0)$(^,然后 0*11*0,然后 $)与 ^0*1|1*0$(^0*11*0$)。

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

组号

The whole pattern is 定义 to be group number 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

In other regex flavors (PCRE, Perl), they can also be used in 次例行通话次例行通话.

您可以使用 Matcher.group(int group)访问由某个组匹配的文本。组号可以按照上述规则进行标识。

在某些正则表达式(PCRE,Perl)中,有一个 分支复位特性允许您将 一样的号码用于 捕捉不同交替分支中的群体

Group name

从 Java7中,您可以定义一个 命名捕获组(?<name>pattern),并且可以访问与 Matcher.group(String name)匹配的内容。正则表达式更长,但是代码更有意义,因为它指示您试图与正则表达式匹配或提取的内容。

组名在模式的反向引用 \k<name>中使用,在替换字符串中使用 ${name}

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

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

为了我们其他人

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

( 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

如你所见,我已经创建了五个组,每个组都用括号括起来。

我包括了!* and * !在两边,使它更清楚。注意,这些字符都不在 RegEx 中,因此不会在结果中生成。Group (0)仅仅给出整个匹配的字符串(在一行中包含我的所有搜索条件)。第1组正好停在第一个空格之前,因为搜索条件中没有包含空格字符。第2组和第4组只是空白,在这种情况下,它实际上是一个空格字符,但也可以是制表符或换行符等。第三组包括空间,因为我把它放在搜索条件... 等等。

希望这能说得通。