一、捕获分组
捕获分组就是把这一组的数据捕获出来再用一次
正则内部使用:\\组号
正则外部使用:$组号
组号的特点:从1开始,连续不间断,以左括号为基准,最左边的是第一组
1.捕获分组的练习
需求1:判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符
举例:a123a b456b 17891 &abc&
需求2:判断一个字符串的开始部分和结束部分是否一致,可以有多个字符
举例:abc123abc b456b 123789123 &!@abc&!@
需求3:判断一个字符串的开始部分和结束部分是否一致,开始部分内部每个字符也需要一致
举例:aaa123aaa bbb456bbb 111789111 &&abc&&
package a07regexdemo;
public class RegexDemo9 {
public static void main(String[] args) {
//需求1:判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符
//举例:a123a b456b 17891 &abc&
// \\组号:表示把第x组的内容拿出来再用一次
String regex1="(.).+\\1";
System.out.println("a123a".matches(regex1));//true
System.out.println("b456b".matches(regex1));//true
System.out.println("17891".matches(regex1));//true
System.out.println("&abc&".matches(regex1));//true
System.out.println("&abc&0".matches(regex1));//false
System.out.println("----------------------");
//需求2:判断一个字符串的开始部分和结束部分是否一致,可以有多个字符
//举例:abc123abc b456b 123789123 &!@abc&!@
String regex2="(.+).+\\1";
System.out.println("abc123abc".matches(regex2));//true
System.out.println("b456b".matches(regex2));//true
System.out.println("123789123".matches(regex2));//true
System.out.println("&!@abc&!@".matches(regex2));//true
System.out.println("abc123abd".matches(regex2));//false
System.out.println("----------------------");
//需求3:判断一个字符串的开始部分和结束部分是否一致,开始部分内部每个字符也需要一致
//举例:aaa123aaa bbb456bbb 111789111 &&abc&&
//(.):把首字母看做一组
// \\2:表示把首字母拿出来再次使用
//*:作用于\\2,表示后面重复的内容出现0次或多次
String regex3="((.)\\2*).+\\1";
System.out.println("aaa123aaa".matches(regex3));//true
System.out.println("bbb456bbb".matches(regex3));//true
System.out.println("111789111".matches(regex3));//true
System.out.println("&&abc&&".matches(regex3));//true
System.out.println("aaa123aab".matches(regex3));//false
}
}
运行结果:
练习:口吃替换
需求:将字符串:我要学学编编编编程程程程程程
替换为:我要学编程
package a07regexdemo;
public class RegexDemo10 {
public static void main(String[] args) {
//需求:将字符串:我要学学编编编编程程程程程程
// 替换为:我要学编程
String str="我要学学编编编编程程程程程程";
//(.)表示把重复内容的第一个字符看做一组
//\\1:表示第一个字符再次出现
//+:至少一次
//$1:表示把正则表达式中第一组的内容再拿出来用
String result = str.replaceAll("(.)\\1+", "$1");
System.out.println(result);
}
}
运行结果:
二、非捕获分组
分组之后不需要再用本组数据,仅仅是把数据括起来
(?:正则)------->获取所有
(?=正则)------>获取前面部分
(?!正则)------->获取不是指定内容的前面部分