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));
    }
}
运行结果:
相关推荐
weixin_408099679 分钟前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
爱喝水的鱼丶23 分钟前
SAP-ABAP:ALV通用封装实践——搭建可复用的ALV开发工具类,减少80%重复代码
开发语言·性能优化·sap·abap·erp·alv
钱六两33 分钟前
#3、SpringAI 接入deepSeek大模型(喂饭版)
java·spring boot·ai编程
脱胎换骨-军哥1 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
songroom1 小时前
Kimi K3:Rust封装XTP接口详细教程实践
开发语言·后端·rust
kebeiovo1 小时前
游戏服务端开发:Actor模型详解(Go语言)
开发语言·后端·golang
迷途呀2 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp
null_172 小时前
IntelliJ IDEA 极致流畅配置方案:Ultra 9 285K + 64GB 内存实测
java·ide·intellij-idea
Herbert_hwt2 小时前
建立Java程序开发
java·开发语言
好好沉淀2 小时前
@ExcelIgnoreUnannotated 和 @AutoMapper 详解
java