正则表达式

1.什么是正则表达式?

正则表达式就是用某种模式去匹配字符串的一个公式,通过他的语法可以快速的定位、提取、处理一些文本内容

一个小例子

  • 找到文本中连续4个数字的部分
    在这里插入图片描述

2.正则表达式语法

分类

在这里插入图片描述

转义号

请添加图片描述

  • 就比如说 “ . ”在正则表达式中的语法表示 除了 \n 以为的任意字符,但如果说你就像匹配 “ . ” 那么就需要用转义符

在这里插入图片描述
在这里插入图片描述

限定符

请添加图片描述
请添加图片描述

字符匹配符

在这里插入图片描述
请添加图片描述

请添加图片描述

在这里插入图片描述

选择匹配符

请添加图片描述

定位符

在这里插入图片描述

分组、捕获、反向引用

在这里插入图片描述
在这里插入图片描述

请添加图片描述

例题:结巴程序

public void test(){
        //将这段结巴话语用正则表达式修改成不结巴的
        String content="我...要开....开飞飞飞飞机";

        //1.去掉。。。
        Pattern pattern = Pattern.compile("\\.");
        Matcher matcher = pattern.matcher(content);
        String str = matcher.replaceAll("");

        System.out.println(str);//我要开开飞飞飞飞机


        //去掉重复字符
        Pattern pattern1=Pattern.compile("(.)\\1+");//找到所有具有重复字符的字符串
        Matcher matcher1 = pattern1.matcher(str);
        while(matcher1.find()){
            System.out.println(matcher1.group(0));//开开   飞飞飞飞
        }

        String str2 = matcher1.replaceAll("$1");//用分组的字符替换掉
        System.out.println(str2);//我要开飞机
    }

例题

在这里插入图片描述

   @Test
    public void test1(){
          //汉字
//        String content="abc章鱼哥123";
//        String regstr="[\\u0391-\\uffe5]+";

        //1-9开头的6位数
//        String content="123456";
//        String regstr="^[1-9]\\d{5}$";

       // 必须以13,14,15,18开头的11位数
//        String content="15111111111";
//        String regstr="^1[3|4|5|8]\\d{9}$";

        
        //判断url
        String content="http://edu.3dsmax.tech/yg/bilibili/my6652/pc/qg/05-51/index.html"+
                "#201211-1?track_id=jMc0jn-hm-yHr"+
                "NfVad37YdhOUh41XYmjlss9zocM26gspY5ArwWuxb4wYWpmh2Q7GzR7doU0wLkViEhUlO1qNtukyAgake2jG1bTd23lR57XzV83E9bAXWkStcAh";
        String regstr="^(http|https)://([\\w-]+\\.)+[\\w]+[\\/[\\w-?=&/%.#]*]+$";

        Pattern pattern = Pattern.compile(regstr);
        Matcher matcher = pattern.matcher(content);

        while(matcher.find()){
            System.out.println(matcher.group(0));
        }
    }

3.源码解析

String content="1999百度”二字,来自于八百年前南宋词人辛弃疾的一句词:众里寻他千百度。这句话描1111述了词人对理想的执着追求。1999年底,身在美国硅" +
                "谷的李彦宏看到了中国互联网及中文搜索111引擎服务的巨大发展潜力," +
                "抱着技术改变世界的梦想,他毅然辞掉硅2222谷的高薪工作,携搜索引擎专利技术,于 2000年          1月1日在中关村创建了百度公司";
       //匹配连续4个数字的字符串
        String regstr="\\d{4}";

        Pattern pattern = Pattern.compile(regstr);
        Matcher matcher = pattern.matcher(content);

        while(matcher.find()){
            System.out.println(matcher.group(0));
        }
  • matcher.find( )的作用:根据regstr指定的规则,去匹配字符串(例如:1999)
  • 调用该方法时,会在底层创建一个int【20】的数组,用于存放匹配到的字符串索引,默认初始值为-1
    在这里插入图片描述
  • 当匹配到符合的字符串时,会存放该字符串的索引下标记录到数组中,groups[0]=0,groups[1]=3+1
    在这里插入图片描述
  • 同时,会记录下字符串结束位(4)到oldLast中,那么下次匹配字符串时就是从索引为4的位置开始
    在这里插入图片描述
  • 截取完这个字符串,那么就会继续寻找下一个符合条件的字符串
  • 当找到下一个符合要求的字符串时,就会覆盖groups[0]和group[1]的值,同时更新oldLast
    在这里插入图片描述

在这里插入图片描述

  • find()获取指定字符串的索引就是为了配合matcher.group(0)该方法的使用
    在这里插入图片描述

在这里插入图片描述

  • 因为传入的值为0,那么就是说每一次截取的下标都是0,1,而group[0]、group[1]前面也说到了,就是存放符合字符串的索引,就是验证了该方法的输出
    在这里插入图片描述
  • 底层创建的20个位置的groups也不是没有用到的时候,他弄这么大的原因就是为了解决分组的问题
  • 接下来修改一下题目
    在这里插入图片描述
  • 刚开始还是创建一个int【20】的数组,初始值还是-1

在这里插入图片描述

  • 但是当匹配到对应字符串的时候,数组后面的位置就开始起作用了,因为我加了2个() ,就代表着分了2组,groups[2]、groups[3]就正好代表着第一个分组的开始、结束下标,groups[4]、groups[5]就正好代表着第二个分组的开始、结束下标。
    在这里插入图片描述
  • 第二个匹配字符串

在这里插入图片描述

  • 还记得matcher.group()的源码吗?
  • 此时当填入的grous值不是0,而是1时,换算过来对应的就是groups[2]、groups[3],这个就正好是第一个分组对应的开始、结束下标
  • 当值为2时,对应groups[4]、groups[5],就是第二个分组的下标,以此类推。。。。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

4.Matcher、Pattern、PatternSyntaxException介绍

在这里插入图片描述

Marcher的常用方法

请添加图片描述

5.String中也提供了一些可以调用正则表达式的构造器

名称作用
public String replaceAll(String regex,String replacement)替换指定字符串
public boolean matches(String regex)判断是否符合
public String[] split(String regex)以指定字符为分界线
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值