正则表达式中,每组是有组号的,也就是序号
规则:
1.从1开始,连续不间断。
2.以左括号为基准,最左边的是第一组,其次为第二组,以此类推。
\\组号,表示把第x组的内容调出来再用一次
1.正则表达式捕获分组
public static void main(String[] args) {
//需求1:判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符
//举例:a123a b456b &1122& a123456b 1001
String regex1 = "(.).+\\1";
System.out.println("a123a".matches(regex1));
System.out.println("b456b".matches(regex1));
System.out.println("&1122&".matches(regex1));
System.out.println("a123456b".matches(regex1));
System.out.println("1001".matches(regex1));
System.out.println("----------------");
//需求2:判断一个字符串的开始部分和结束部分是否一致,可以有多个字符
//举例:abc123abc b456b 123a56123 &*@123&*@ abc123&*@
String regex2 = "(.+).+\\1";
System.out.println("abc123abc".matches(regex2));
System.out.println("b456b".matches(regex2));
System.out.println("123a56123".matches(regex2));
System.out.println("&*@123&*@".matches(regex2));
System.out.println("abc123&*@".matches(regex2));
System.out.println("---------------");
//需求3:判断一个字符串的开始部分和结束部分是否一致,开始部分内部每个字符也需要一致
//举例:aaa123aaa bbb456bbb 11123456111 &&7b9&&
//注意,是左括号开始标识序号!!所以比较大的括号是1号,括点的括号是2号
String regex3 = "((.)+\\2*).+\\1";
System.out.println("aaa123aaa".matches(regex3));
System.out.println("bbb456bbb".matches(regex3));
System.out.println("11123456111".matches(regex3));
System.out.println("&&7b9&&".matches(regex3));
}
$组号:表示从外部调入正则表达式
public static void main(String[] args) {
//需求:用捕获分组将”aaabbbccc“替换成”abc“
String str = "aaabbbccc";
System.out.println(str);
//此为单个字符重复情况的规则
String regex1 = "(.)\\1+";
//这是修改规则
String regex2 = "$1";
//替换代码
String result = str.replaceAll(regex1,regex2);
System.out.println(result);
}
非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来 --- 不占用组号
1.(?:正则) --- 获取所有
2.(?=正则) --- 获取前面部分
3.(?!正则) --- 获取不是指定内容的前面部分
此时可看见,输入?:之后,使用\\1报错了,说明此时标注的?:表示前面的后面的都不再捕获,那么这里就不存在组号了,所以\\1在捕获谁呢?而其他两个也是一样的,日常中,我们大部分都是使用?:的形式更多点。