我有以下几行,
typeName="ABC:xxxxx;";
Run Code Online (Sandbox Code Playgroud)
我需要取这个词ABC,
我写了以下代码片段,
Pattern pattern4=Pattern.compile("(.*):");
matcher=pattern4.matcher(typeName);
String nameStr="";
if(matcher.find())
{
nameStr=matcher.group(1);
}
Run Code Online (Sandbox Code Playgroud)
所以,如果我把group(0)我弄,ABC:但如果我把group(1)它ABC,所以我想知道
这是什么0和1意味着什么呢?如果有人能用好的例子来解释我会更好.
正则表达式模式中包含一个:,所以为什么group(1)结果省略了?第1组是否检测到括号内的所有单词?
所以,如果我再添加两个括号,如\\s*(\d*)(.*):,那么,会有两个组吗?group(1)将返回(\d*)零件并group(2)返回(.*)零件?
代码片段的目的是为了清除我的困惑.这不是我正在处理的代码.上面给出的代码可以用String.split()更简单的方式完成.
nha*_*tdh 175
捕获组 (pattern)创建一个具有捕获属性的组.
您可能经常看到(和使用)的一个相关的(?:pattern),它创建一个没有捕获属性的组,因此命名为非捕获组.
当你需要重复的图案,例如序列A组通常使用(\.\w+)+,或以指定交替应该生效,例如^(0*1|1*0)$(^,然后0*1或1*0,然后$)与^0*1|1*0$(^0*1或1*0$).
除分组外,捕获组还将记录捕获组内模式匹配的文本(pattern).使用你的榜样,(.*):,.*比赛ABC和:比赛:,由于.*是内捕获组(.*),该文本ABC被记录,捕获组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
Run Code Online (Sandbox Code Playgroud)
组编号用于\n模式和$n替换字符串中的反向引用.
在其他正则表达式(PCRE,Perl)中,它们也可用于子例程调用.
您可以访问特定组匹配的文本Matcher.group(int group).可以使用上述规则识别组编号.
在一些正则表达式(PCRE,Perl)中,有一个分支重置功能,允许您使用相同的数字来捕获不同交替分支中的组.
从Java 7开始,您可以定义一个命名的捕获组 (?<name>pattern),并且可以访问与之匹配的内容Matcher.group(String name).正则表达式更长,但代码更有意义,因为它表明您要使用正则表达式匹配或提取的内容.
组名用于\k<name>模式和${name}替换字符串中的反向引用.
命名捕获组仍然使用相同的编号方案编号,因此也可以通过它们访问它们Matcher.group(int group).
在内部,Java的实现只是从名称映射到组号.因此,您不能对2个不同的捕获组使用相同的名称.
Mic*_*ims 89
这是一个简单明了的例子,说明了它是如何工作的
正则表达式: ([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
Run Code Online (Sandbox Code Playgroud)
如您所见,我创建了五个组,每个组都括在括号中.
我加入了!*和*!在任何一方使其更清晰.请注意,这些字符都不在RegEx中,因此不会在结果中生成.组(0)仅为您提供完整匹配的字符串(我的所有搜索条件都在一行中).第1组在第一个空格之前停止,因为空格字符未包含在搜索条件中.第2组和第4组只是白色空间,在这种情况下实际上是空格字符,但也可以是制表符或换行符等.第3组包含空格,因为我将其放在搜索条件中......等等.
希望这是有道理的.
Mic*_*rek 44
括号()用于启用正则表达式短语的分组.
该group(1)包含是括号之间的字符串,(.*)所以.*在这种情况下,
并group(0)包含完整匹配的字符串.
如果你有更多的组(读取(...)),它将被放入具有下一个索引(2,3等等)的组中.