一:分租的相关概念
分组实质上就是利用括号将正则表达式分开,前一组不会干扰下一组的正则表达。
正则表达式中的分组类别:
- 捕获分组:后续还要继续使用本组的数据。
- 非捕获分组:分组之后不需要再使用本组的数据,仅仅是把数据括起来。
这里要介绍的非捕获分组的内容:
符号 | 含义 | 举例 |
(?:正则) | 获取所有 | python(?:a|b|c) |
(?=正则) | 获取前面的内容 | python(?=a|b|c) |
(?!正则) | 获取不是指定内容的前面 | python(?!a|b|c) |
在Java中默认的是捕获分组(可以获取每组中的内容反复使用)。
组号的特点:
- 从1开始,连续不间断。
- 以左括号为基准,最左边是第一组
二:举例分析
案例1:
截图如下:
打印结果如下:
正则表达式中各部分内容的解析:
- (.): 表示将字符串中重复内容的第一个字符看作为一组
- \\1:表示第一个字符再次出现
- +:表示至少一次,或多次
- $: 表示把正则表达式中第一组的内容再拿出来用。
案例1代码如下:
/* 需求:
将字符串:我要学学编编编编程程程程程程。
替换为:我要学编程 */
String str = "我要学学编编编编程程程程程程";
//需求: 把重复的内容 替换为 单个的
//学学 学
//编编编编 编
//程程程程程程 程
//(.) 表示重复的内容的第一个字符看做一组
//\\1 表示第一个字符再次出现
//+ 至少一次
//$1 表示把正则表达式中第一组的内容,再拿出来用
String result = str.replaceAll("(.)\\1+","$1");
System.out.println(result);
}
案例2:
截图如下:
运行结果如图:
所有的代码如下:
/*
非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来
身份证号码:
61191080935228457x
710801197639022302
75040119812705387x
930133197264039024
430102197607046442
04278906767843563x
*/
//先定义身份证的正则表达式
String regex = "[1-9]\\d{16}(?:\\d|X|x)";
System.out.println("61191080935228457x".matches(regex));
System.out.println("710801197639022302".matches(regex));
System.out.println("75040119812705387x".matches(regex));
System.out.println("930133197264039024".matches(regex));
System.out.println("430102197607046442".matches(regex));
System.out.println("04278906767843563x".matches(regex));
}