对Java正则表达式中的Matcher组感到困惑

P b*_*sak 109 java regex

我有以下几行,

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,所以我想知道

  1. 这是什么01意味着什么呢?如果有人能用好的例子来解释我会更好.

  2. 正则表达式模式中包含一个:,所以为什么group(1)结果省略了?第1组是否检测到括号内的所有单词?

  3. 所以,如果我再添加两个括号,如\\s*(\d*)(.*):,那么,会有两个组吗?group(1)将返回(\d*)零件并group(2)返回(.*)零件?

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

nha*_*tdh 175

捕获和分组

捕获组 (pattern)创建一个具有捕获属性的.

您可能经常看到(和使用)的一个相关的(?:pattern),它创建一个没有捕获属性的,因此命名为非捕获组.

当你需要重复的图案,例如序列A组通常使用(\.\w+)+,或以指定交替应该生效,例如^(0*1|1*0)$(^,然后0*11*0,然后$)与^0*1|1*0$(^0*11*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组包含空格,因为我将其放在搜索条件中......等等.

希望这是有道理的.

  • 对于初学者来说很容易理解的完美示例。我怀疑这与 python 中的 reg ex 分组相同吗?或者还有什么区别吗?我是 reg ex 的新手,这就是为什么我对两种语言都有点困惑。 (2认同)

Mic*_*rek 44

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

group(1)包含是括号之间的字符串,(.*)所以.*在这种情况下,

group(0)包含完整匹配的字符串.

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

  • 是的,我们可以这么说. (3认同)
  • 所以,我是正确的,添加括号实际上是为了创建组? (2认同)