在正则表达式中,从左到右第一个左括号确定为第一组,继续往右看再有左括号它表示的组数就加一。我们可以在正则表达式中使用 \\组数 的方法表示第几组,如\\1表示第一组的内容。
1.捕获分组
捕获分组就是把这一组的数据捕获出来,后续还要继续使用本组的数据。
练习一:
题目需求:
需求1:判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符
举例:a123a b456b 17891 &abc&
需求2:判断一个字符串的开始部分和结束部分是否一致,可以有多个字符
举例:abc123abc b456b 123567123 &!abc&!
需求3:判断一个字符串的开始部分和结束部分是否一致,开始部分内部每个字符也需一致
举例:aaa123aaa bbb456bbb 111567111 &&abc&&
编写代码:
public class Test13 {
//捕获分组就是把这一组的数据捕获出来,在用一次
//需求1:判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符
//举例:a123a b456b 17891 &abc&
//需求2:判断一个字符串的开始部分和结束部分是否一致,可以有多个字符
//举例:abc123abc b456b 123567123 &!abc&!
//需求3:判断一个字符串的开始部分和结束部分是否一致,开始部分内部每个字符也需一致
//举例:aaa123aaa bbb456bbb 111567111 &&abc&&
public static void main(String[] args) {
//需求1:判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符
System.out.println("--------需求1--------");
String regex1 = "(.).+\\1";
System.out.println("a123a".matches(regex1));
System.out.println("b456b".matches(regex1));
System.out.println("17891".matches(regex1));
System.out.println("&abc&".matches(regex1));
System.out.println("12345".matches(regex1));
//需求2:判断一个字符串的开始部分和结束部分是否一致,可以有多个字符
System.out.println("--------需求2--------");
String regex2 = "(.+).+\\1";
System.out.println("abc123abc".matches(regex2));
System.out.println("b456b".matches(regex2));
System.out.println("123567123".matches(regex2));
System.out.println("&!abc&!".matches(regex2));
System.out.println("12345".matches(regex2));
//需求3:判断一个字符串的开始部分和结束部分是否一致,开始部分内部每个字符也需一致
System.out.println("--------需求3--------");
String regex3 = "((.)\\2*).+\\1";
System.out.println("aaa123aaa".matches(regex2));
System.out.println("bbb456bbb".matches(regex2));
System.out.println("111567111".matches(regex2));
System.out.println("&&abc&&".matches(regex2));
System.out.println("12345".matches(regex2));
}
}
运行结果:
练习二:
这个练习我们会使用到在正则表达式外部使用某组的数据,在正则表达式内部使用某组数据时,我们通过 \\组数 获取,在正则表达式外部使用某组数据,我们要通过 $组数 来获取
题目需求:
需求:将字符串:我要学学学编编编编程程程程程
替换为:我要学编程
编写代码:
public class Test14 {
public static void main(String[] args) {
String str = "我要学学学编编编编程程程程程";
//regex为重复汉字的正则表达式
String result = str.replaceAll("(.)\\1+", "$1");
System.out.println(result);
}
}
运行结果:
2.非捕获分组
分组之后不需要使用本组数据,仅仅是把数据括起来。
特点:不占用组号
常用方式:(?:) (?=) (?!) 第一种最多使用
练习一:
题目需求:
简单的验证身份证号,要求18位组成,第一位不为0,其余都为数字,最后一位可以是数字也可以是X和x。
编写代码:
public class Test15 {
public static void main(String[] args) {
String regex = "[1-9]\\d{16}(?:\\d|X|x)";
System.out.println("130111111111111111".matches(regex));
}
}