Java—— 正则表达式 方法及捕获分组

识别正则表达式的方法

方法名说明
public String[] matches(String regex)

判断字符串是否满足

正则表达式的规则

public string replaceAll(String regex,string newstr)

按照正则表达式的

规则进行替换

public string[] split(String regex)

按照正则表达式的

规则切割字符串

代码实现:

public class Test11 {
    public static void main(String[] args) {

        //第一个方法之前已经使用,主要演示后两个方法
        String str = "熊大mnduub熊二jnjdnjb光头强";

        String regex = "\\w+";
        String s = str.replaceAll(regex, "vs");
        System.out.println(s);//熊大vs熊二vs光头强

        String[] splitArr = str.split(regex);
        for (int i = 0; i < splitArr.length; i++) {
            System.out.println(splitArr[i]);
        }
        //熊大
        //熊二
        //光头强
    }
}

捕获分组:

一个括号代表一组,捕获分组就是把这一组的数据捕获出来,再用一次。
正则内部使用:\\组号
正则外部使用:$组号

组号定义规则:

从1开始,连续不间断

以左括号为基准,最左边的是第一组,其次为第二组,以此类推 

案例演示:

需求1:正则内部使用

判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符
举例:a123a  b456b  17891  &abc&
判断一个字符串的开始部分和结束部分是否一致,可以有多个字符
举例:abc123abc  b456b  123789123  &!@abc&!@
需求3:判断一个字符串的开始部分和结束部分是否一致,开始部分每个字符也需要一致
举例:aaa123aaa  bbb456bbb  111789111  &&abc&& 

代码实现:

public class Test12 {
    public static void main(String[] args) {
        //判断一个字符串的开始字符和结束字符是否一致,只考虑一个字符
        //举例:a123a b456b 17891 &abc&
        //判断一个字符串的开始部分和结束部分是否一致,可以有多个字符
        //举例:abc123abc b456b 123789123 &!@abc&!@
        //需求3:判断一个字符串的开始部分和结束部分是否一致,开始部分每个字符也需要一致
        //举例:aaa123aaa bbb456bbb 111789111 &&abc&&

        //首字符任意,结束字符与首字符相同,首字符将捕获出来,再用一次
        //首字符:(.)
        //中间部分:.+
        //结束字符:\\1
        String regex1 = "(.).+\\1";
        System.out.println("a123a".matches(regex1));//true
        System.out.println("b456b".matches(regex1));//true
        System.out.println("17891".matches(regex1));//true
        System.out.println("&abc&".matches(regex1));//true
        System.out.println("&abcz".matches(regex1));//false
        System.out.println("-------------------");

        //开始部分可以有多个字符,结束部分与其一致,将开始部分捕获出来,再用一次
        //开始部分:(.+)
        //中间部分:.+
        //结束部分:\\1
        String regex2 = "(.+).+\\1";
        System.out.println("abc123abc".matches(regex2));//true
        System.out.println("b456b".matches(regex2));//true
        System.out.println("123789123".matches(regex2));//true
        System.out.println("&!@abc&!@".matches(regex2));//true
        System.out.println("&!@abc&!x".matches(regex2));//false
        System.out.println("-------------------");


        //开始部分可以有多个字符,每个字符也需要一致
        //结束部分与开始部分一致,将开始部分捕获出来,再用一次
        //开始部分:((.)\\2*))  (.)为第二组,需要重复,可以捕获出来用
        //中间部分:.+
        //结束部分:\\1
        String regex3 = "((.)\\2*).+\\1";
        System.out.println("aaa123aaa".matches(regex3));//true
        System.out.println("bbb456bbb".matches(regex3));//true
        System.out.println("111789111".matches(regex3));//true
        System.out.println("&&abc&&".matches(regex3));//true
        System.out.println("aaa123aaz".matches(regex3));//false
    }
}

需求2:正则外部使用

将字符串:我要学学编编编编程程程程程程
替换为:我要学编程

代码实现:

public class Test13 {
    public static void main(String[] args) {
        //将字符串:我要学学编编编编程程程程程程
        //替换为:我要学编程

        String str = "我要学学编编编编程程程程程程";

        //(.) 表示把重复内容的第一个字符看做一组
        //\\1 表示第一字符再次出现
        //+ 表示至少一次
        //$1 表示把正则表达式中第一组的内容,再拿出来用
        String s = str.replaceAll("(.)\\1+", "$1");
        System.out.println(s);//我要学编程
    }
}

非捕获分组:

分组之后不需要再用本组数据,仅仅是把数据括起来。

符号含义举例
(?:正则)获取所有Java(?:8|11|17)
(?=正则)获取前面部分Java(?=8|11|17)
(?!正则)获取不是指定内容的前面部分Java(?!8|11|17)

代码演示:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Test9 {
    public static void main(String[] args) {
 
        String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
                "因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
 
        //需求1
        //其中 ?是占位符代表字符串Java,=表示字符串Java后面连接的部分
        //但是在获取的时候,只获取=前半部分
        String regex1 = "Java(?=8|11|17)";
        //调用方法进行爬虫
        show(regex1,str);
        //Java
        //Java
        //Java
        //Java
 
 
        //需求2
        //方式1:常规方式
        String regex2 = "Java(8|11|17)";
        show(regex2,str);
        //Java8
        //Java11
        //Java17
        //Java17
 
        //方式2:?是占位符代表字符串Java,:表示字符串Java后面连接的部分
        //在获取的时候,可以全部获取
        String reges3 = "Java(?:8|11|17)";
        show(reges3,str);
        //Java8
        //Java11
        //Java17
        //Java17
 
        //需求3
        //?是占位符代表字符串Java,!表示字符串Java后面连接的部分
        ///在获取的时候,获取的是除了与!后面连接匹配的子串
        String regex4 = "Java(?!8|11|17)";
        show(regex4,str);//Java
    }
 
    //抽取一个方法进行爬虫
    public static void show(String regex,String str){
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        while(m.find()){
            String s = m.group();
            System.out.println(s);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值