问题
我有以下几行,
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*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)中,有一个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等等)。