问题

我有以下几行,

typeName="ABC:xxxxx;";

我需要取一个字ABC

我写了以下代码片段,

Pattern pattern4=Pattern.compile("(.*):");
matcher=pattern4.matcher(typeName);

String nameStr="";
if(matcher.find())
{
    nameStr=matcher.group(1);

}

所以如果我把putgroup(0)I得到ABC:但是如果我把group(1)it改为ABC那么我想知道

  • 这0和1是什么意思?如果有人能用很好的例子来解释我会更好。
  • 正则表达式模式包含:其中,为什么group(1)结果省略了?第1组是否检测到括号内的所有单词?
  • 所以,如果我再添加两个括号,例如,\ s *(\ d )(。):那么,会有两个组吗?组(1)将返回(\ d )部分,组(2)返回(。)部分?

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


#1 热门回答(151 赞)

##捕获和分组

捕获group(pattern)创建具有捕获属性的agroupt。

你可能经常看到(并使用)的相关的一个是(?:pattern),它创建了具有完全属性的agroup,因此命名为非捕获组。

当你需要重复一系列模式时,通常使用一组,或指定交替应该生效的地方,例如.^(0*1|1*0)$(^,then0*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)中,有一个abranch resetfeature,它允许你在交替的不同分支中使用相同数字for**捕获组。

团队名字

在Java 7中,你可以定义anamed capture group(?<name>pattern),并且可以访问与Matcher.group(String name)匹配的内容。正则表达式更长,但代码更有意义,因为它表明你要使用正则表达式匹配或提取的内容。

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

命名捕获组仍然使用相同的编号方案编号,因此也可以通过6672234760访问它们。

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


#2 热门回答(75 赞)

##为我们其他人

这是一个简单明了的例子,说明了它是如何工作的

正则表达式:([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组包含空格,因为我将它放在搜索条件中......等等。

希望这是有道理的。


#3 热门回答(42 赞)

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

group(1)包含在这个案例中括号内的字符串(.*)so.*

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

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


原文链接