在Java正则expression式中的Matcher组困惑
我有以下线路,
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是什么意思? 如果有人能用好的例子来解释我,那会更好。 - 
正则expression式模式包含一个
:其中,为什么group(1)结果省略了? 组1是否检测括号内的所有单词? - 
所以,如果我再加两个括号,如
\\s*(\d*)(.*):那么,会有两个组?group(1)将返回(\d*)部分和group(2)返回(.*)部分? 
 代码片段的目的是为了澄清我的困惑。 这不是我正在处理的代码。 上面给出的代码可以使用String.split()以更简单的方式完成。 
捕获和分组
  捕获组 (pattern)创build一个具有捕获属性的组 。 
 你可能经常看到(和使用)的一个相关的是(?:pattern) ,它创build一个没有捕获属性的组 ,因此被命名为非捕获组 。 
 当需要重复一系列模式时,通常使用一个组,例如(\.\w+)+ ,或者指定交替应该在哪里生效,例如^(0*1|1*0)$ ( ^ ,然后是0*1或1*0 ,然后$ )与^0*1|1*0$ ( ^0*1或1*0$ )。 
 除了分组之外,捕获组还将logging捕获组(pattern)内的模式所匹配的文本。 使用你的例子, (.*): , .*匹配ABC和: matches:,并且因为.*在捕获组(.*) ,所以文本ABC被logging为捕获组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和replacestring中的$n 。 
在其他正则expression式(PCRE,Perl)中,它们也可以用于子例程调用 。
 您可以使用Matcher.group(int group)访问与某个组匹配的文本。 组号可以用上面的规则来标识。 
在一些正则expression式(PCRE,Perl)中,有一个分支重置function,允许您使用相同的数字来捕捉不同分支交替的组 。
组名
 从Java 7开始,您可以定义一个命名捕获组 (?<name>pattern) ,并且可以访问与Matcher.group(String name)匹配的内容。 正则expression式更长,但代码更有意义,因为它表明你正在尝试匹配或提取的正则expression式。 
 组名称用于模式中的反向引用\k<name>和replacestring中的${name} 。 
 命名捕获组仍然使用相同的编号scheme进行编号,因此也可以通过Matcher.group(int group)进行访问。 
在内部,Java的实现只是从名称映射到组号。 因此,您不能为2个不同的捕获组使用相同的名称。
为我们其余的
这是一个简单明了的例子,它是如何工作的
 正则expression式: ([a-zA-Z0-9]+)([\s]+)([a-zA-Z ]+)([\s]+)([0-9]+) 
 string: "!* UserName10 John Smith 01123 *!" 
 group(0): UserName10 John Smith 01123 group(1): UserName10 group(2): group(3): John Smith group(4): group(5): 01123 
正如你所看到的,我已经创build了五个组,每个组都包含在括号内。
我包括!*和*! 在任何一方,使其更清晰。 请注意,这些字符都不在RegEx中,因此不会在结果中生成。 组(0)只给你整个匹配的string(我的所有search条件在一行中)。 组1在第一个空格之前停止,因为空格字符未包含在search条件中。 第2组和第4组是简单的白色空间,在这种情况下字面上是空格字符,但也可以是制表符或换行符等。第3组包括空格,因为我把它放在search条件中。
希望这是有道理的。
 括号()用于启用正则expression式短语的分组。 
  group(1)包含括号(.*) so .*之间的string 
  group(0)包含完整的匹配string。 
 如果你有更多的组(读取(...) ),它将被放入具有下一个索引的组中(2,3等)。