正则表达式——Robyn编程学习(Java)

正则表达式

为什么我们要学习正则

自然语言处理是计算机程序的重要组成部分,而正则表达式则是处理文本的利器,通过设置合适的正则表达式,可以快速处理文本,从而提高工作的效率。

本节课的逻辑架构

正则表达式的处理模式

我们先看一串正则表达式的标准处理代码:

 String content = "2019年是一个特殊的日子,在该年年末,新冠疫情爆发,于是,2019年又被称为最后一个黄金年代。";

//1.创建正则表达式(匹配4个数字)
String regStr = "(\\d\\d\\d\\d)";
//2.创建正则表达式对象
Pattern pattern = Pattern.compile(regStr);
//3.创建匹配器matcher
Matcher matcher = pattern.matcher(content);
//4.开始匹配
while(matcher.find()){//默认为贪婪匹配
    System.out.println("匹配成功,匹配到的值为:"+ matcher.group(0));
}

从上程序可以看出:正则表达式的处理分为3步:创建正则表达式对象-使用表达式对象的matcher方法创建匹配器,再使用matcher的find方法进行匹配。

这时候就出现了一个问题:为什么匹配要使用find方法呢,还有group(0)代表什么意思?这就引入了下一个部分:正则表达式的底层实现

正则表达式的底层实现

首先来分析find()和group()的底层源码

//find()方法最后调用的方法
 boolean match(Matcher matcher, int i, CharSequence seq) {
            matcher.last = i;
            matcher.groups[0] = matcher.first;
            matcher.groups[1] = matcher.last;
            return true;
        }
//匹配整个的正则表达式
起点:group[0] = 0(开始的索引)
终点:group[1] = 4(结束的索引+1)
//当出现分组的情况时    
记录 1 组()匹配到的字符串 groups[2] = 0 groups[3] = 2
记录 2 组()匹配到的字符串 groups[4] = 2 groups[5] = 4

//group()的底层源码
public String group(int group) {
        if (first < 0)
            throw new IllegalStateException("No match found");
        if (group < 0 || group > groupCount())
            throw new IndexOutOfBoundsException("No group " + group);
        if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
            return null;
        return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();//返回起点和终点的字符串(这里配合find方法设下的索引)
    }

我们可以看到find()方法不仅实现了逻辑上的判断,并且对于分组方法进行了索引;而group()方法这就是根据分组情况来取字符串。

为什么find()和group()方法不作为一个方法呢

这就是Java的妙处,一个方法的代码耦合性太高,所以一个代码用来分组设置索引,一个方法用来根据索引来获取字符串,这样就实现了低耦合。

正则表达式的基础语法介绍

  1. 转义字符

    image

  2. 字符匹配符

image
image

  1. 限定符

image

image

  1. 定位符

image

这些语法不需要特意去记,根据需求来进行选择就好

String regStr ="^[0-9]+\\-[a-z]+$"
//至少一个数字开头,至少一个小写字母结束    

正则表达式的高阶应用

image

反向引用是建立在分组和捕获的基础上的

匹配5个连续的相同数字:(\\d)\\1{4}(这里的\\1就是对于第一个组的反向引用)
匹配个位与千位相同,十位与百位相同的数:(\\d)(\\d)\\2\\1
String content = "我....我要....学学学学....编程 java!";
//匹配的语句
content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");

String类中正则表达式的使用

  1. 替换功能
public String replaceAll(String regex,String replacement)
  1. 判断功能
public boolean matches(String regex){}
  1. 分割功能
public String[] split(String regex)

正则表达式示例

验证电子邮件是否合法
需求:
1.只能有一个@
2.@前面是用户名,可以是a-z,A-z,0-9,-_字符
3.@后面是域名,域名只能是英文字母(且点不确定)
 //直接用字符串的matches匹配比较好
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入想要匹配的字符串:");
        String string = scanner.next();
        //匹配的正则表达式
        String req = "^[0-9a-zA-Z_-]+@([a-zA-Z]+\\.)+[a-zA-Z]+$";//这里匹配一个代码块就用()分组包起来
        if(string.matches(req)){
            System.out.println("匹配成功,是邮箱");
        }else{
            System.out.println("格式不正确!");
        }
    
    
    
posted @   深海之燃  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示