在Java正则表达式中对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 ,所以我想知道

  • 这个01是什么意思? 如果有人能够用很好的例子来解释我会更好。

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

  • 所以,如果我再加两个括号,例如s*(d*)(.*) :那么,会有两个组? group(1)将返回(d*)部分和group(2)返回(.*)部分?

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


    捕获和分组

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

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

    当需要重复一系列模式时,通常使用一个组,例如(.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
    

    组编号用于模式中的反向引用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个不同的捕获组使用相同的名称。


    对于我们其他人

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

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

    希望这是有道理的。


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

    group(1)包含括号(.*) so .*之间的字符串

    group(0)包含整个匹配的字符串。

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

    链接地址: http://www.djcxy.com/p/74787.html

    上一篇: Confused about Matcher group in Java regex

    下一篇: "captured group equals" in a condition