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));
    }
}
运行结果:
相关推荐
snow@li4 小时前
SpringBoot:AOP日志切面全景梳理/原理+流程+实战+避坑
java·开发语言·spring boot
Nil2084 小时前
C++ emplace_back 与 push_back 详解
开发语言·c++
ma_king4 小时前
Spring Boot 接入飞书自定义机器人
java·后端
2401_894915534 小时前
部署 GEO 优化源码常见报错排查:端口、伪静态、缓存问题解决
java·运维·服务器·后端·缓存·开源
七牛开发者4 小时前
Codex 实践系列 Vol.04:用 Goal 和 Plan 管住一个长任务
java·数据库·人工智能·github·copilot
我命由我123454 小时前
Android Drawable - gradient
android·java·java-ee·kotlin·android studio·android-studio·android runtime
clear sky .4 小时前
[freertos源码阅读]task.c任务篇
c语言·开发语言
XR1234567884 小时前
工业园区整体组网,方案对比怎么选?
开发语言·php
东东最爱敲键盘4 小时前
day9.C++多态之虚函数
开发语言·c++
码云数智-园园4 小时前
类似小鹅通的知识付费小程序平台有哪些
开发语言