Java 基础进阶篇(十八):正则表达式匹配规则和应用

2023-11-10


一、正则表达式概述

  正则表达式是对字符串(包括普通字符(例如:a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。

简而言之,正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。


二、正则表达式的匹配规则

匹配方法:
在这里插入图片描述

字符类(默认匹配一个字符):                预定义的字符类(默认匹配一个字符):
在这里插入图片描述

贪婪的量词(配合匹配多个字符):
在这里插入图片描述
注:X 代表前两框的字符类。

举例:

public class RegexDemo01 {
    public static void main(String[] args) {
        //public boolean matches(String regex):判断是否与正则表达式匹配,匹配返回true
        // 只能是 a  b  c
        System.out.println("a".matches("[abc]")); // true
        System.out.println("z".matches("[abc]")); // false
        System.out.println("---------------------------------");

        // 不能出现 a  b  c
        System.out.println("a".matches("[^abc]")); // false
        System.out.println("z".matches("[^abc]")); // true
        System.out.println("---------------------------------");

        System.out.println("a".matches("\\d")); // false
        System.out.println("3".matches("\\d")); // true
        System.out.println("333".matches("\\d")); // false 因为只匹配一个字符,多个字符直接就 false
        System.out.println("z".matches("\\w")); // true
        System.out.println("2".matches("\\w")); // true
        System.out.println("21".matches("\\w")); // false 因为只匹配一个字符,多个字符直接就 false
        System.out.println("你".matches("\\w")); //false
        System.out.println("你".matches("\\W")); // true
        System.out.println("---------------------------------");
        //  以上正则匹配只能校验单个字符。

        // 校验密码
        // 必须是数字 字母 下划线 至少 6位
        System.out.println("2442fsfsf".matches("\\w{6,}")); // true
        System.out.println("244f".matches("\\w{6,}")); //false

        // 验证码 必须是数字和字符  必须是4位
        System.out.println("23dF".matches("[a-zA-Z0-9]{4}")); // true
        System.out.println("23_F".matches("[a-zA-Z0-9]{4}")); //false
        System.out.println("23dF".matches("[\\w&&[^_]]{4}")); // true
        System.out.println("23_F".matches("[\\w&&[^_]]{4}")); //false
    }
}

三、正则表达式在方法中的应用

3.1 校验手机号、邮箱和座机电话号码

public class RegexDemo02 {
    public static void main(String[] args) {
        // 校验手机号码 邮箱 电话号码
        checkPhone();
        checkEmail();
        checkTel();
    }

	// 校验手机号
    public static void checkPhone(){
        Scanner sc = new Scanner(System.in);
        while(true){
            System.out.print("输入手机号:");
            String phone = sc.next();
            // 判断手机号的格式是否正确
            if(phone.matches("1[3-9]\\d{9}")){
                System.out.println("成功!");
                break;
            }else{
                System.out.println("失败!");
            }
        }
    }

	// 校验邮箱
    public static void checkEmail(){
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.print("请您输入您的注册邮箱:");
            String email = sc.next();
            // 判断邮箱格式是否正确   3268847878@qq.com
            // 判断邮箱格式是否正确   3268847dsda878@163.com
            // 判断邮箱格式是否正确   3268847dsda878@pci.com.cn
            // "."代表任何字符,"\\."等同于 \. 是纯 .
            if(email.matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}")){
                System.out.println("邮箱格式正确,注册完成!");
                break;
            }else {
                System.out.println("格式有误!");
            }
        }
    }

	// 校验电话号码(座机)
    public static void checkTel(){
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请您输入您的电话号码:");
            String tel = sc.next();
            // 判断电话号码格式是否正确   027-3572457  0273572457
            if(tel.matches("0\\d{2,6}-?\\d{5,20}")){
                System.out.println("格式正确,注册完成!");
                break;
            }else {
                System.out.println("格式有误!");
            }
        }
    }
}

3.2 字符串的内容替换和分割

在这里插入图片描述

举例1:在字符串中寻找姓名

public class RegexDemo03 {
    public static void main(String[] args) {
        String names = "小路dhdfhdf342蓉儿43fdffdfbjdfaf小何";

        String[] arrs = names.split("\\w+");
        for (int i = 0; i < arrs.length; i++) {
            System.out.println(arrs[i]); // 小路 蓉儿 小何
        }

        String str = names.replaceAll("\\w+", "**");
        System.out.println(str); // 小路**蓉儿**小何

        String[] strArr = str.split("\\*\\*");
        for (int i = 0; i < strArr.length; i++) {
            System.out.println(strArr[i]);
        }
    }
}

举例2:正则表达式爬取信息中的内容

public class RegexDemo04 {
    public static void main(String[] args) {
        String rs = "来黑马程序学习Java,电话020-43422424,或者联系邮箱" +
                "itcast@itcast.cn,电话18762832633,0203232323" +
                "邮箱bozai@itcast.cn,400-100-3233 ,4001003232";

        // 需求:从上面的内容中爬取出 电话号码和邮箱。
        // 1、定义爬取规则,字符串形式
        String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|"+
                "(0\\d{2,6}-?\\d{5,20})|(400-?\\d{3,9}-?\\d{3,9})";

        // 2、把这个爬取规则编译成匹配对象。
        Pattern pattern = Pattern.compile(regex);

        // 3、得到一个内容匹配器对象
        Matcher matcher = pattern.matcher(rs);

        // 4、开始查找
        while (matcher.find()) {
            String rs1 = matcher.group();
            System.out.println(rs1);
        }
    }
}

四、编程题目

4.1 表示数值的字符串

剑指 Offer 20. 表示数值的字符串:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/

题目描述:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

数值(按顺序)可以分成以下几个部分:

  1. 若干空格
  2. 一个 小数 或者 整数
  3. (可选) 一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
  4. 若干空格

小数(按顺序)可以分成以下几个部分:

  1. (可选) 一个符号字符( ‘+’ 或 ‘-’ )
  2. 下述格式之一:
    1. 至少一位数字,后面跟着一个点 ‘.’
    2. 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
    3. 一个点 ‘.’ ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选) 一个符号字符(‘+’ 或 ‘-’)
  2. 至少一位数字

部分数值列举如下:

["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]

部分非数值列举如下:

["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]

用例:

输入 s = “0” s = “e” s = “.” s = " .1 "
输出 true false false true

代码实现:

class Solution {
    public boolean isNumber(String s) {
        // 去除首尾空格
        s = s.trim();
        return isDecimal(s) || isInteger(s);
    }

    /**
     * 判断是否是小数
     */
    public boolean isDecimal(String s){
        //(可选)一个符号字符('+' 或 '-')
        // 下述格式之一:
        //      至少一位数字,后面跟着一个点 '.'
        //      至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
        //      一个点 '.' ,后面跟着至少一位数字
        String regx1 = "[+-]{0,1}[0-9]{1,20}\\.[0-9]{0,20}([eE]{1}[+-]{0,1}[0-9]{1,20}){0,1}";
        String regx2 = "[+-]{0,1}\\.[0-9]{1,20}([eE]{1}[+-]{0,1}[0-9]{1,20}){0,1}";
        return s.matches(regx1) || s.matches(regx2);
    }

    /**
     * 判断是否是整数
     */
    public boolean isInteger(String s){
        //(可选)一个符号字符('+' 或 '-')
        //  至少一位数字
        String regx1 = "[+-]{0,1}[0-9]{1,20}([eE]{1}[+-]{0,1}[0-9]{1,20}){0,1}";
        return s.matches(regx1);
    }
}

4.2 非严格递增连续数字序列

题目描述:

输入一个字符串仅包含大小写字母和数字,求字符串中包含的最长的非严格递增连续数字序列长度。

比如:12234 属于非严格递增数字序列

输入描述:输入一个字符串仅包含大小写字母和数字

输出描述: 输出字符串中包含的最长的非严格递增连续数字序列长度

用例:

输入 abc2234019A334bc abc02a234019A334bc
输出 4 3

本题思路:

通过正则表达式,分割字符串中的数字部分,再使用滑动窗口算法解决递增序列问题。

代码实现:

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] nums = str.split("[a-zA-Z]{1,}");
        // ["", "02", "234019", "334"]
        int maxLen = 0;
        for(int i = 0; i < nums.length; i ++){
            if(!nums[i].isEmpty()){
                maxLen = Math.max(maxLen, getNumsLength(nums[i]));
            }
        }
        System.out.println(maxLen);
    }

    // abc02a234019A334bc
    // 滑动窗口求最大长度
    public static int getNumsLength(String num){
        int sum = 1;
        int start = 0;
        for(int end = 1; end < num.length(); end ++){
            char ch = num.charAt(end);
            if(ch - num.charAt(end-1) >= 0){
                sum = Math.max(sum, end-start+1);
            }else{
                start = end;
            }
        }
        return sum;
    }
}

文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 基础进阶篇(十八):正则表达式匹配规则和应用 的相关文章

随机推荐

  • vue 中provide的用法_Vue中使用provide和inject

    相信大家在工作中一定遇到过多层嵌套组件 而vue 的组件数据通信方式又有很多种 比如vuex dollar parent与 dollar children prop dollar emit与 dollar on dollar attrs与
  • 为什么需要对数值类型的特征做归一化?

    为什么需要对数值类型的特征做归一化 1 举例子 比如分析一个人的身高和体重对健康的影响 身高的单位是m 范围是1 6 1 8 体重的单位是kg 在50kg 100kg之间 分析出的结果自然会倾向于数值差异较大的体重特征 因此我们需要数值归一
  • 新版Spring Boot(10)- Spring Boot 整合数据持久层(1)

    1 整合JdbcTemplate Service Description TODO Author tzb Date 2021 8 22 10 23 Version 1 0 Service public class UserService A
  • 【Mysql】删除表记录,并限制条数

    删除表数据 好删 那如果要限制条数 如何删除呢 例如 有个表tag list 我要删除aid为6666的前100条数据 sql如下 删除表记录limit限制条数 delete from tag list where aid 6666 lim
  • JUC 六. 线程中断 与 LockSupport

    目录 一 基础理解 如何退出一个线程 volatile 与 AtomicBoolean 中断线程示例 Thread中自带的中断api示例 阻塞状态线程中断时异常解决 二 Thread中自带的中断底层分析 三 总结 一 基础理解 先了解几个问
  • 打印九九口诀表(pta练习题)

    下面是一个完整的下三角九九口诀表 本题要求对任意给定的一位正整数N 输出从1 1到N N的部分口诀表 输入格式 输入在一行中给出一个正整数N 1 N 9 输出格式 输出下三角N N部分口诀表 其中等号右边数字占4位 左对齐 include
  • AIDL原理和相关文件解析

    Binder概述 相信从事Android相关的研发人员 都对Binder有个或多或少的了解 相关技术博客也有一大推 我今天对Binder的学习过程进行一个记录 理论性的叙述会少一点 更多的是基于AS自动生成的AIDL文件进行代码分析 但读者
  • 【Java基础】使用Java 8的Stream API来简化Map集合的操作

    在 Java 8 中引入的 Stream API 是一种非常强大的函数式编程工具 可以帮助开发者更加方便地对集合进行操作和处理 而在 Map 集合中 Stream API 的使用也能够极大地简化代码 并提升程序效率和可读性 在本文中 我们将
  • 网络基础通过子网掩码 计算主机数网络范围

    192 168 11 16 27 主机的个数为32 27 5 2 5 32 32 2 30主机数为30 主机范围是0 31 63 95 必须是32的倍数 16在0 32之间 31是广播地址 网络号是192 168 11 0
  • 白话学习防火墙3 之防火墙工作模式(适用于IPS、IDS、WAF等其他安全设备)

    说白了 透明模式就是当交换机使 路由模式就是当路由使 混杂就是杂交物种 即当作路由使 又当作交换机使 透明模式 透明模式一般用于网络建设完 网络功能基本已经实现的情况下 用户需要加装防火墙以实现安全区域隔离的要求 早期也称之为桥模式 桥这个
  • jvm的内存模型之eden区

    浅谈java内存模型 不同的平台 内存模型是不一样的 但是jvm的内存模型规范是统一的 其实java的多线程并发问题最终都会反映在java的内存模型上 所谓线程安全无 非是要控制多个线程对某个资源的有序访问或修改 总结java的内存模型 要
  • 如何完成卷积神经网络有关的毕业设计

    前言 毕业设计对于每个学生而言都是一种十分痛苦的渡劫仪式 尤其是当你拿到的是完全陌生的毕业设计的时候 内心无疑有各种王尼玛从心中飘过 我在这里聊聊我在完成毕设的过程中得到的一些经验教训 因为我的毕业设计主题是卷积神经网络 所以在这里我的话题
  • 【云计算与数据中心规划】【期末复习题】【2022秋】

    文章目录 一 单选题 共7题 二 多选题 共15题 三 填空题 共7题 四 判断题 共5题 五 简答题 共7题 Reference 题量 41 满分 100 0 一 单选题 共7题 1 以下哪个虚拟机系统可以独立安装在计算机硬件之上 不需要
  • 什么是整洁的代码

    点击蓝色 五分钟学算法 关注我哟 加个 星标 天天中午 12 15 一起学算法 作者 xybaby 来源 https www cnblogs com xybaby p 11335829 html 写出整洁的代码 是每个程序员的追求 clea
  • opengl es3.0学习篇八:纹理

    OpenGL ESMIP 开发十年 就只剩下这套架构体系了 gt gt gt 学习内容来源and参考 opengl es 3 0编程指南 https www jianshu com p 4d8d35288a0f 3D图形渲染最基本的操作之一
  • 05 神经网络语言模型(独热编码+词向量的起源)

    博客配套视频链接 https space bilibili com 383551518 spm id from 333 1007 0 0 b 站直接看 配套 github 链接 https github com nickchen121 Pr
  • 基于opencv的家居智能安防机器视觉系统

    基于opencv的家居智能安防机器视觉系统 关键词 Windows 树莓派 python opencv 1 写在前面的话 大学4年很快过去了 因为疫情原因我们从大四上学期结束之后直接跳到了大学的尾声 毕业设计 毕业答辩 毕业的环境 回顾整个
  • 树莓派基础之外设开发编程

    外设开发篇 一 树莓派外设开发接口 二 树莓派wiringPi库 三 树莓派控制继电器 四 继电器组硬件控制开发 五 超声波模块介绍 六 串口通信协议概述 七 树莓派和语音模块的综合应用 一 树莓派外设开发接口 树莓派的接口 对主控芯片来说
  • 江西省电子专题大赛考点讲解三:CD4017_五阶约翰逊十进制计数器

    芯片引脚图 图CD4017 1 CD4017芯片引脚图 芯片功能概述 表CD4017 2 CD4017芯片真值表 图CD4017 3 CD4017芯片时序图 芯片实例讲解 实例一 输出十进制0 9 图CD4017 4 利用CD4017芯片作
  • Java 基础进阶篇(十八):正则表达式匹配规则和应用

    文章目录 一 正则表达式概述 二 正则表达式的匹配规则 三 正则表达式在方法中的应用 3 1 校验手机号 邮箱和座机电话号码 3 2 字符串的内容替换和分割 四 编程题目 4 1 表示数值的字符串 4 2 非严格递增连续数字序列 一 正则表