对Java正则表达式中的Matcher组感到困惑

时间:2013-05-13 08:27:25

标签: java regex

我有以下一行,

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)会返回(.*)部分吗?

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

3 个答案:

答案 0 :(得分:172)

捕获和分组

捕获组 (pattern)创建一个,其捕获属性。

您可能经常看到(并使用)的相关内容是(?:pattern),它会创建而不会捕获属性,因此命名为非 - 捕捉小组

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

除了分组之外,捕获组还将记录捕获组(pattern)内的模式匹配的文本。使用您的示例,(.*):.*匹配ABC:匹配:,因为.*位于捕获组(.*)内,为捕获组1记录文本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开始,您可以定义named capturing group (?<name>pattern),并且可以访问与Matcher.group(String name)匹配的内容。正则表达式更长,但代码更有意义,因为它表明您要使用正则表达式匹配或提取的内容。

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

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

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

答案 1 :(得分:86)

为我们其他人

以下是一个简单而明确的示例,说明其工作原理

正则表达式:([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

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

我收录了!*和*!在任何一方使其更清晰。请注意,这些字符都不在RegEx中,因此不会在结果中生成。组(0)仅为您提供完整匹配的字符串(我的所有搜索条件都在一行中)。第1组在第一个空格之前停止,因为空格字符未包含在搜索条件中。第2组和第4组只是白色空间,在这种情况下实际上是空格字符,但也可以是制表符或换行符等。第3组包含空格,因为我将其放在搜索条件中......等等。

希望这是有道理的。

答案 2 :(得分:44)

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

group(1)包含括号(.*)之间的字符串,在这种情况下为.*

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

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