深刻理解正则表达式的"组"以及"?:"

来源:互联网 发布:网络黄金egd崩盘了吗 编辑:程序博客网 时间:2024/06/05 08:57

一、正则表达式组的概念:
Groups
Group是指里用括号括起来的,能被后面的表达式调用的正则表达式。Group 0 表示整个表达式,group 1表示第一个被括起来的group,以此类推。所以;
A(B(C))D
里面有三个group:group 0是ABCD, group 1是BC,group 2是C。

二、?:的理解—取消所在括号的组:
有点难以理解,直接通过小demo来讲解。

public static void main(String[] args) {        String reg = "(\\d{1,3}(.*?)\\d{2}([a-z]{3}))";        Pattern p = Pattern.compile(reg);//        Matcher m = p.matcher("123abc45def");        System.out.println("group count = "+m.groupCount());        if(m.matches()){            System.out.println("结果:"+m.group(2));        }else{            System.out.println("not found");        }    }

分析如下:
如果不加 ?:则有3个组:
group(1)—–123abc45def
group(2)—–abc
group(3)—–def

如果在最外面的括号中加入?:如String reg = “(?:\d{1,3}(.*?)\d{2}([a-z]{3}))”,则只有2个组了,?:取消它所在的括号的组。
此时,group(1)—abc, group(2)—def;

如果在第二个括号里加入?:,则表示取消该括号的组,此时只有两个组。
如:String reg = “(\d{1,3}(?:.*?)\d{2}([a-z]{3}))”;

则group(1)—–123abc45def
group(2)——def.

如果加入两个?:,如:String reg = “(?:\d{1,3}(?:.*?)\d{2}([a-z]{3}))
则,只剩下一个组了,即group(1)—def。

这是我的个人理解,不正之处,请斧正。

1 0
原创粉丝点击