Java常用API_正则表达式_分组——捕获分组与非捕获分组介绍与练习

在正则表达式中,从左到右第一个左括号确定为第一组,继续往右看再有左括号它表示的组数就加一。我们可以在正则表达式中使用 \\组数 的方法表示第几组,如\\1表示第一组的内容。

1.捕获分组

捕获分组就是把这一组的数据捕获出来,后续还要继续使用本组的数据。

练习一:

题目需求:

需求1:判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符

举例:++a++ 123++a++ ++b++ 456++b++ ++1++ 789++1++ ++&++ abc++&++

需求2:判断一个字符串的开始部分和结束部分是否一致,可以有多个字符

举例:++abc++ 123++abc++ ++b++ 456++b++ ++123++ 567++123++ ++&!++ abc++&!++

需求3:判断一个字符串的开始部分和结束部分是否一致,开始部分内部每个字符也需一致

举例:++aaa++ 123++aaa++ ++bbb++ 456++bbb++ ++111++ 567++111++ ++&&++ abc++&&++

编写代码:
java 复制代码
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));
    }
}
运行结果:
练习二:

这个练习我们会使用到在正则表达式外部使用某组的数据,在正则表达式内部使用某组数据时,我们通过 \\组数 获取,在正则表达式外部使用某组数据,我们要通过 $组数 来获取

题目需求:

需求:将字符串:我要学学学编编编编程程程程程

替换为:我要学编程

编写代码:
java 复制代码
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。

编写代码:
java 复制代码
public class Test15 {
    public static void main(String[] args) {
        String regex = "[1-9]\\d{16}(?:\\d|X|x)";
        System.out.println("130111111111111111".matches(regex));
    }
}
运行结果:
相关推荐
小张认为的测试3 分钟前
Liunx上Jenkins 持续集成 Java + Maven + TestNG + Allure + Rest-Assured 接口自动化项目
java·ci/cd·jenkins·maven·接口·testng
百流31 分钟前
scala文件编译相关理解
开发语言·学习·scala
蘑菇丁33 分钟前
ansible批量生产kerberos票据,并批量分发到所有其他主机脚本
java·ide·eclipse
呼啦啦啦啦啦啦啦啦1 小时前
【Redis】持久化机制
java·redis·mybatis
Evand J2 小时前
matlab绘图——彩色螺旋图
开发语言·matlab·信息可视化
我想学LINUX2 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
深度混淆2 小时前
C#,入门教程(04)——Visual Studio 2022 数据编程实例:随机数与组合
开发语言·c#
雁于飞3 小时前
c语言贪吃蛇(极简版,基本能玩)
c语言·开发语言·笔记·学习·其他·课程设计·大作业
wenxin-4 小时前
NS3网络模拟器中如何利用Gnuplot工具像MATLAB一样绘制各类图形?
开发语言·matlab·画图·ns3·lr-wpan