首页 > 编程语言 >正则表达式——Robyn编程学习(Java)

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

时间:2022-09-24 22:01:25浏览次数:49  
标签:group String 匹配 正则表达式 matcher Robyn groups 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("格式不正确!");
        }
    
    
    

标签:group,String,匹配,正则表达式,matcher,Robyn,groups,Java
From: https://www.cnblogs.com/robyn2022/p/16726765.html

相关文章

  • 基于SSM的驾校预约系统的设计与实现Java驾校管理系统(源码调试+讲解+文档)
    ......
  • java五周目笔记
    数组—、数组的概述1.数组的理解:数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。2.数组相关的概念:......
  • Javaweb学习笔记第十一弹(内含Servlet相关知识呦!)
    Web核心静态资源:HTML,CSS,JavaScript,图片等,负责页面展现动态资源:Servlet,JSP等,负责逻辑处理数据库:负责存储数据HTTP协议:定义通信规则Web服务器:负责解析HTTP协议,解析请求......
  • javascrip 函数的运用
    //函数使用分为两步:声明函数调有函数//1.声明函数//function函数名(){//console.log('函数');//}function......
  • Java流程控制03(顺序结构,选择结构)
    顺序结构:Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行顺序结构是最简单的算法结构语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若......
  • Java流程控制04(if的多种结构)
    if单选择结构:我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用“if语句”来表示语法:if(布尔表达式){//如果布尔表达式为true将......
  • JavaScript 计时事件
    做一个在设定的时间间隔之后来执行代码,称为计时事件两个关键字:setInterval()-间隔指定的毫秒数不停地执行指定的代码setTimeout()-在指定的毫秒数后执行指定代码。......
  • javaEE——Servlet
    ServletServlet是Java提供的一门动态web资源开发技术Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet......
  • JavaScript 弹窗
    JavaScript中有三种消息框:警告框、确认框、提示框警告框:用于确保用户可以得到某些信息语法:window.alert("****");确认框:用于验证是否接受用户操作语法:window.con......
  • JavaWeb---MVC : Model(模型)、View(视图)、Controller(控制器)
    博客参考:https://blog.csdn.net/jsdoulaoula/article/details/125648785?spm=1001.2014.3001.5502 《构造》    《耦合/依赖》    这个就是层与层之......