Java中的正则表达式


Java中提供了对正则表达式的支持。String类提供了一个matches方法来进行简单的字符串正则匹配,也有专门的Pattern类和Matcher类来提供更加强大的正则支持。

1、String类的matches方法

api中的描述:
在这里插入图片描述
在这里插入图片描述
测试:

    public static void main(String[] args) {
        // 腾讯的邮箱格式
        // 首字符不能为0,qq号长度6到11位且为纯数字,以@qq.com结尾
        String regex = "[1-9][\\d]{5,10}@qq\\.com{1}$";
        String email0 = "2321422@163.com";
        String email2 = "123122saa@163.cn";
        String email3 = "1069316276@qq.com";
        String email4 = "1824367412@qq.com@qq.com";
        String email5 = "43544@qq.com";
        // matches方法匹配正则
        System.out.println("2321422@163.com是否为腾讯邮箱?" + email0.matches(regex));
        System.out.println("123122saa@163.cn是否为腾讯邮箱?" + email2.matches(regex));
        System.out.println("1069316276@qq.com是否为腾讯邮箱?" + email3.matches(regex));
        System.out.println("1824367412@qq.com@qq.com是否为腾讯邮箱?" + email4.matches(regex));
        System.out.println("43544@qq.com是否为腾讯邮箱?" + email5.matches(regex));
    }

在这里插入图片描述
该方法较为简单,传一个正则表达式参数就行了,需要注意的是Java中转义字符的写法和正则中的略不同,要加两条\而不是一条\。

2、Pattern类

java.util.regex.Pattern类没有公共构造方法。要创建一个Pattern对象,只能调用其公共静态方法compile,它返回一个Pattern对象。该方法接受一个正则表达式作为它的第一个参数。

java.util.regex.Pattern类的api说明:
在这里插入图片描述
该类提供的方法:
在这里插入图片描述
在这里插入图片描述
标记的是使用的较多的方法。

java.util.regex.Pattern类的部分源码:
在这里插入图片描述
它是一个final修饰的最终类,并且已经序列化了。
在这里插入图片描述
在这里插入图片描述
compile方法用于返回Pattern实例。
在这里插入图片描述
matcher方法返回Matcher实例。
在这里插入图片描述
在这里插入图片描述

3、Matcher类

java.util.regex.Matcher类也没有公共构造方法,需要调用Pattern对象的matcher方法来获得一个Matcher对象。

api说明:
在这里插入图片描述
提供的方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
标记的方法是用的多一点的。

java.util.regex.Matcher类的部分源码:
在这里插入图片描述
此类也是最终类,并且实现了一个MatchResult接口。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、测试

通过代码测试常用的一些方法。

    public static void main(String[] args) {
        // 任意一个正整数的正则
        String regex = "[1-9]\\d*";
        // compile静态方法获取Pattern对象
        Pattern pattern = Pattern.compile(regex);
        // 由Pattern对象获取Matcher对象
        Matcher matcher = pattern.matcher("25");
        // matches方法测试是否匹配
        boolean res = matcher.matches();
        System.out.println("25是一个正整数吗?" + res);
        System.out.println("-25是一个正整数吗?" + pattern.matcher("-25").matches());
        System.out.println("0是一个正整数吗?" + pattern.matcher("0").matches());
        // matches静态方法更加简便
        boolean res2 = Pattern.matches(regex, "100");
        System.out.println("100是一个正整数吗?" + res2);
    }

在这里插入图片描述

    public static void main(String[] args) {
          String word = "I have writen 100 songs!";
          // 这个正则需要进行捕获
          String regex = "(\\D*)(\\d+)(\\D*)";
          // 获取Pattern对象
          Pattern p = Pattern.compile(regex);
          // 获取Matcher对象
          Matcher m = p.matcher(word);
          // find方法判断匹配模式是否有下一个子序列
          if(m.find()) {
              // group方法返回捕获的子序列
              System.out.println("捕获的值:" + m.group(0));
              System.out.println("捕获的值:" + m.group(1));
              System.out.println("捕获的值:" + m.group(2));
              System.out.println("捕获的值:" + m.group(3));
          } else {
              System.out.println("无任何捕获值!");
          }
    }

在这里插入图片描述

    public static void main(String[] args) {
          String word = "you are too young,you have no money,and you him mother!";
          // 统计单词you出现的次数
          String regex = "\\byou\\b";
          int count = 0;
          Pattern p = Pattern.compile(regex);
          Matcher m = p.matcher(word);
          while(m.find()) {
              count++;
              // start方法返回匹配项的开始索引,end方法返回结束索引
              System.out.println("起始位置" + m.start() + "结束位置" + m.end() + ",出现第" + count + "次");
          }
    }

在这里插入图片描述

    public static void main(String[] args) {
        // 测试matches方法和lookingAt方法
        String res = "kawayiyiyiyi";
        String regex = "kaway";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(res);
        // matches方法是全部匹配
        System.out.println("是否全部匹配正则?" + m.matches());
        // lookingAt方法是包含正则就行了,但必须从第一个字符开始
        System.out.println("是否匹配?" + m.lookingAt());
        String res2 = "you are single,and you are dog,and you have no money!";
        // 匹配的正则
        String regex2 = "you";
        // 替换的内容
        String rep = "你";
        Pattern p2 = Pattern.compile(regex2);
        Matcher m2 = p2.matcher(res2);
        // replaceFirst方法替换第一个
        System.out.println("替换后的内容:" + m2.replaceFirst(rep));
        // replaceAll方法是替换全部
        System.out.println("替换后的内容:" + m2.replaceAll(rep));
        String res3 = "ycz132173gas1212hd112g1d1k21ycz";
        String regex3 = "\\d{1,}";
        String and = "+";
        StringBuffer sb = new StringBuffer("");
        Pattern p3 = Pattern.compile(regex3);
        Matcher m3 = p3.matcher(res3);
        while(m3.find()) {
            // appendReplacement方法需要两个参数,第一个是StringBuiler类型,第二个是要替换成的内容
            // 这个方法会将原串中匹配的内容替换掉
            // 并且将替换后的新串(只在替换位置之间的内容,最后一次替换位置之后的内容不会追加)追加到StringBuilder对象中
            m3.appendReplacement(sb, and);
        }
        System.out.println("原串:" + res3);
        System.out.println("替换后的内容:" + sb.toString());
        // appendTail方法会将最后一次替换内容之后的所有内容追加到StringBuilder对象中
        // 因此得出一个结论
        //appendReplacement方法 + appendTail方法可以起到替换所有的效果,相当于replaceAll方法
        m3.appendTail(sb);
        System.out.println("替换后的内容:" + sb.toString());
    }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值