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));
    }
}
运行结果:
相关推荐
会飞的胖达喵21 分钟前
Qt自动信号槽连接机制:深入解析与应用实践
开发语言·qt
无奈笑天下23 分钟前
银河麒麟V10虚拟机安装vmtools报错:/bin/bash解释器错误, 权限不够
linux·运维·服务器·开发语言·经验分享·bash
superman超哥26 分钟前
仓颉动态特性探索:反射API的原理、实战与性能权衡
开发语言·后端·仓颉编程语言·仓颉·仓颉语言·仓颉动态特性·反射api
程序员阿鹏32 分钟前
@Autowired和@Resource的区别
java·开发语言·spring
Halo_tjn34 分钟前
Java List集合知识点
java·开发语言·windows·算法·list
superman超哥40 分钟前
仓颉元编程之魂:宏系统的设计哲学与深度实践
开发语言·后端·仓颉编程语言·仓颉·仓颉语言·仓颉语言特性
一 乐41 分钟前
健身房预约|基于springboot + vue健身房预约小程序系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习·小程序
CC.GG1 小时前
【C++】哈希表的实现
java·c++·散列表
玄同7651 小时前
Python 数据类型:LLM 语料与 API 参数的底层处理逻辑
开发语言·人工智能·python·自然语言处理·llm·nlp·知识图谱
Slow菜鸟1 小时前
Java基础 | 布隆过滤器
java·开发语言