我有以下一行,
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
,那么我想知道
这0
和1
是什么意思?如果有人能用好的例子来解释我会更好。
正则表达式模式中包含:
,为什么group(1)
结果会省略?第1组是否检测到括号内的所有单词?
所以,如果我再添加两个括号,例如\\s*(\d*)(.*)
:那么,会有两个组吗? group(1)
会返回(\d*)
部分而group(2)
会返回(.*)
部分吗?
代码片段的目的是为了清除我的困惑。这不是我正在处理的代码。上面给出的代码可以通过String.split()
以更简单的方式完成。
答案 0 :(得分:172)
捕获组 (pattern)
创建一个组,其捕获属性。
您可能经常看到(并使用)的相关内容是(?:pattern)
,它会创建组而不会捕获属性,因此命名为非 - 捕捉小组。
当您需要重复一系列模式时,通常会使用一组,例如: (\.\w+)+
,或指定更改应生效的位置,例如^(0*1|1*0)$
(^
,然后0*1
或1*0
,然后$
)与^0*1|1*0$
(^0*1
或1*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等等)。