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));
    }
}
运行结果:
相关推荐
j***49561 天前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
代码游侠1 天前
日历的各种C语言实现方法
c语言·开发语言·学习·算法
草莓熊Lotso1 天前
unordered_map/unordered_set 使用指南:差异、性能与场景选择
java·开发语言·c++·人工智能·经验分享·python·网络协议
20岁30年经验的码农1 天前
Spring Cloud Gateway 网关技术文档
java
likuolei1 天前
XML DOM 节点类型
xml·java·服务器
ZHE|张恒1 天前
Spring Bean 生命周期
java·spring
夏天的味道٥1 天前
@JsonIgnore对Date类型不生效
开发语言·python
q***38511 天前
SpringCloud实战十三:Gateway之 Spring Cloud Gateway 动态路由
java·spring cloud·gateway
小白学大数据1 天前
Python爬虫伪装策略:如何模拟浏览器正常访问JSP站点
java·开发语言·爬虫·python
SEO_juper1 天前
别再纠结LLMs.txt了!它背后的真相与最佳使用场景,一文讲透。
开发语言·ai·php·数字营销