上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-灯塔上往建站

ava 正则表达式的捕获组(capture group)
分类 编程技术
捕获组分为:
普通捕获组(Expression)
命名捕获组(?Expression)
普通捕获组
从正则表达式左侧开始,每出现一个左括号"("记做一个分组,分组编号从 1 开始。0 代表整个表达式。
对于时间字符串:2017-04-25,表达式如下
(d{4})-((d{2})-(d{2}))有 4 个左括号,所以有 4 个分组:
| 编号 | 捕获组 | 匹配 |
|---|
| 0 | (d{4})-((d{2})-(d{2})) | 2017-04-25 |
| 1 | (d{4}) | 2017 |
| 2 | ((d{2})-(d{2})) | 04-25 |
| 3 | (d{2}) | 04 |
| 4 | (d{2}) | 25 |
public static final String DATE_STRING = "2017-04-25";public static final String P_COMM = "(d{4})-((d{2})-(d{2}))";
Pattern pattern = Pattern.compile(P_COMM);Matcher matcher = pattern.matcher(DATE_STRING);matcher.find();System.out.printf("
matcher.group(0) value:%s", matcher.group(0));System.out.printf("
matcher.group(1) value:%s", matcher.group(1));System.out.printf("
matcher.group(2) value:%s", matcher.group(2));System.out.printf("
matcher.group(3) value:%s", matcher.group(3));System.out.printf("
matcher.group(4) value:%s", matcher.group(4));
命名捕获组
每个以左括号开始的捕获组,都紧跟着 ?,而后才是正则表达式。
对于时间字符串:2017-04-25,表达式如下:
(?<year>d{4})-(?<md>(?<month>d{2})-(?<date>d{2}))有 4 个命名的捕获组,分别是:
| 编号 | 名称 | 捕获组 | 匹配 |
|---|
| 0 | 0 | (?d{4})-(?(?d{2})-(?d{2})) | 2017-04-25 |
| 1 | year | (?d{4})- | 2017 |
| 2 | md | (?(?d{2})-(?d{2})) | 04-25 |
| 3 | month | (?d{2}) | 04 |
| 4 | date | (?d{2}) | 25 |
命名的捕获组同样也可以使用编号获取相应值。
public static final String P_NAMED = "(?<year>d{4})-(?<md>(?<month>d{2})-(?<date>d{2}))";public static final String DATE_STRING = "2017-04-25";
Pattern pattern = Pattern.compile(P_NAMED);Matcher matcher = pattern.matcher(DATE_STRING);matcher.find();System.out.printf("
===========使用名称获取=============");System.out.printf("
matcher.group(0) value:%s", matcher.group(0));System.out.printf("
matcher.group('year') value:%s", matcher.group("year"));System.out.printf("
matcher.group('md') value:%s", matcher.group("md"));System.out.printf("
matcher.group('month') value:%s", matcher.group("month"));System.out.printf("
matcher.group('date') value:%s", matcher.group("date"));matcher.reset();System.out.printf("
===========使用编号获取=============");matcher.find();System.out.printf("
matcher.group(0) value:%s", matcher.group(0));System.out.printf("
matcher.group(1) value:%s", matcher.group(1));System.out.printf("
matcher.group(2) value:%s", matcher.group(2));System.out.printf("
matcher.group(3) value:%s", matcher.group(3));System.out.printf("
matcher.group(4) value:%s", matcher.group(4));
PS:非捕获组
在左括号后紧跟 ?:,而后再加上正则表达式,构成非捕获组 (?:Expression)。
对于时间字符串:2017-04-25,表达式如下:
(?:d{4})-((d{2})-(d{2}))这个正则表达式虽然有四个左括号,理论上有 4 个捕获组。但是第一组 (?:d{
这个正则表达式虽然有四个左括号,理论上有 4 个捕获组。但是第一组 (?:d{4}),其实是被忽略的。当使用 matcher.group(4) 时,系统会报错。
编号 捕获组 匹配
0 (d{4})-((d{2})-(d{2})) 2017-04-25
1 ((d{2})-(d{2})) 04-25
2 (d{2}) 04
3 (d{2}) 25
public static final String P_UNCAP = "(?:d{4})-((d{2})-(d{2}))";
public static final String DATE_STRING = "2017-04-25";
Pattern pattern = Pattern.compile(P_UNCAP);
Matcher matcher = pattern.matcher(DATE_STRING);
matcher.find();
System.out.printf("
matcher.group(0) value:%s", matcher.group(0));
System.out.printf("
matcher.group(1) value:%s", matcher.group(1));
System.out.printf("
matcher.group(2) value:%s", matcher.group(2));
System.out.printf("
matcher.group(3) value:%s", matcher.group(3));
// Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 4
System.out.printf("
matcher.group(4) value:%s", matcher.group(4));
总结
普通捕获组使用方便;
命名捕获组使用清晰;
非捕获组目前在项目中还没有用武之地。
原文地址:https://blog.csdn.net/just4you/article/details/70767928
专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-灯塔上往建站
上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。
服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)