字符串操作的高效工具—正则表达式

news2024/11/13 12:09:30

字符串操作的高效工具—正则表达式

  • 一 . 概述
    • 1.1 认识正则表达式
    • 1.2 正则表达式体验案例
  • 二 . 使用
    • 2.1 字符类
    • 2.2 逻辑运算符
    • 2.3 预定义字符
    • 2.4 数量词
    • 2.5 分组括号
    • 2.6 字符串中常用含有正则表达式的方法

正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本模式匹配工具,用于字符串搜索、替换、验证和解析等操作。它由一系列字符组成,这些字符除了表示自己的字面意思外,还具有特殊的意义,可以用来描述、匹配一系列符合某个句法规则的字符串。
正则表达式在编程语言中广泛应用,如 Python、JavaScript、Java、C# 等,这几门语言都提供了内置的库或函数来支持正则表达式的操作。
那接下来 , 让我们一起研究一下正则表达式的便利之处吧 .
在这里插入图片描述

一 . 概述

1.1 认识正则表达式

由一些特定的字符组成的字符串校验规则就叫做正则表达式 , 正则表达式通常用来校验、检查字符串是否符合规则的 .

正则表达式只能针对字符串进行格式校验 , 常用于对用户输入的字符串数据进行校验 , 比如 : 在一些数据录入的场景中 , 要求年龄必须是 2 位的数字、用户名必须是 8 位长度而且只能包含大小写字母、手机号码的合法性、QQ 号码的合法性等等 .

1.2 正则表达式体验案例

案例 : 设计一个程序 , 让用户输入一个 QQ 号码 , 验证 QQ 号码的合法性 :

  1. QQ 号码必须是 5~15 位长度
  2. QQ 号码必须都是数字
  3. 首位不能为 0

如果使用正常思路编写的话 , 代码如下 :

public class Main {
    private static boolean checkQQ(String qq) {
        // 1. QQ 号码必须是 5~15 位长度
        if (qq.length() < 5 || qq.length() > 15) {
            return false;
        }

        // 2. QQ 号码首位不能为 0
        if (qq.charAt(0) == '0') {
            return false;
        }

        // 3. QQ 号码必须全部是数字
        for (int i = 0; i < qq.length(); i++) {
            char ch = qq.charAt(i);
            if (ch < '0' || ch > '9') {
                return false;
            }
        }

        // 满足所有条件
        return true;
    }
}

如果我们使用正则表达式的话 , 只需要一行就能校验 QQ 号

public class Main {
    private static boolean checkQQ(String qq) {
        return qq.matches("[1-9][0-9]{4,14}");
    }
}

二 . 使用

正则表达式在开发工作中通常是 CV 操作 , 许多开发者针对常见的校验操作已经写好正则表达式了 , 我们只需要无脑使用即可 .

2.1 字符类

方括号 [] 被用于指定字符

举例 :

  1. [abc] : 代表 a、b、c 字符中的一个
  2. [^abc] : 代表除 a、b、c 以外的任何字符
  3. [a-z] : 代表 a-z 的所有小写字符中的一个
  4. [A-Z] : 代表 A-Z 的所有大写字符中的一个
  5. [0-9] : 代表 0-9 之间的某个数字字符
  6. [a-zA-Z0-9] : 代表 a-z 或者 A-Z 或者 0-9 之间的任意一个字符
  7. [a-dm-p] : a~d 或者 m~p 之间的任意一个字符

通过 matches(正则表达式) 方法使用 , 如果匹配了正则表达式就返回 true, 否则就返回 false

public class Main {
    // boolean matches(正则表达式): 如果匹配了正则表达式就返回 true, 否则就返回 false
    public static void main(String[] args) {
        // 1. 验证 str 是否以 h 开头, 以 d 结尾, 中间是 a、e、i、o、u 中的某个字符
        System.out.println("had".matches("h[aeiou]d"));

        // 2. 验证 str 是否以 h 开头, 以 d 结尾, 中间不是 a、e、i、o、u 中的某个字符
        System.out.println("hwd".matches("h[^aeiou]d"));

        // 3. 验证 str 是否以 a-z 的任何一个小写字母开头, 后面跟 ad
        System.out.println("aad".matches("[a-z]ad"));

        // 4. 验证 str 是否以 a-d 或者 m-p 之间的某个字符开头, 后面跟 ad
        System.out.println("bad".matches("[a-dm-p]ad"));
    }
}

2.2 逻辑运算符

&& : 并且

| : 或者

public class Main {
    public static void main(String[] args) {
        // 1. 要求字符串是除 a、e、i、o、u 以外的其他小写字符开头, 后面跟 ad
        System.out.println("vad".matches("[a-z&&[^aeiou]]ad"));

        // 2. 要求字符串是 a、e、i、o、u 中的某个小写字符开头, 后面跟 ad
        System.out.println("aad".matches("[a|e|i|o|u]ad"));
        System.out.println("aad".matches("[aeiou]ad"));// 简写
    }
}

2.3 预定义字符

预定义字符用来简化字符类的书写

预定义字符作用
“.”匹配任何字符
“\d”任何数字 , [0-9] 的简写
“\D”任何非数字 , [^0-9] 的简写
“\s”空白字符 , [\t\n\x0B\f\r] 的简写
“\S”非空白字符 , [^\s] 的简写
“\w”单词字符 , [a-zA-Z_0-9] 的简写
“\W”非单词字符 , [^\w] 的简写

❓ 其中 , \w 表示 a-z、A-Z、_、0-9 之间的字符 , 那如果我们不想要 _ 该怎样编写这个正则表达式呢 ?

✔ [\w&&^_]

public class Main {
    public static void main(String[] args) {
        // 1. 验证 str 是否是三位数字
        // \d\d\d 会报错, 需要进行转义
        System.out.println("123".matches("\\d\\d\\d"));

        // 2. 验证手机号: 1 开头、第二位: 3/5/8、剩下 9 位都是 0-9 的数字
        System.out.println("13555555555".matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));

        // 3. 验证字符串是否以 h 开头, 以 d 结尾, 中间可以是任何字符
        System.out.println("hed".matches("h.d"));
    }
}

2.4 数量词

数量词作用
?0 次或 1 次
*0 次到多次
+1 次或多次
{n}恰好 n 次
{n,}至少 n 次
{n,m}[n,m] 次
public class Main {
    public static void main(String[] args) {
        // 1. 验证 str 是否是 3 位数字
        // \d: 任何数字, [0-9] 的简写
        // {n}: 恰好 n 次
        System.out.println("123".matches("\\d{3}"));

        // 2. 验证 str 是否是多位数字
        // \d: 任何数字, [0-9] 的简写
        // +: 一次或多次
        System.out.println("123456".matches("\\d+"));

        // 3. 验证 str 是否是手机号(1 开头、第二位为 3/5/8、剩下 9 位都为 0-9 之间的数字)
        // []: 匹配 [] 中的任意一个字符
        // \d: 任何数字, [0-9] 的简写
        // {n}: 恰好 n 次
        System.out.println("13555555555".matches("1[358]\\d{9}"));

        // 4. 验证 QQ 号码(① 5~15 位 ② 全部都是数字 ③ 第一位不是 0)
        // []: 匹配 [] 中的任意一个字符
        // \d: 任何数字, [0-9] 的简写
        // {n,m}: 出现了 [n,m] 次
        System.out.println("111111111".matches("[1-9]\\d{4,14}"));
    }
}

2.5 分组括号

分组括号是指将需要重复使用的正则用小括号括起来 , 当做一个小组来看待

比如 : 我们 Windows 的激活码 , 就可以使用分组括号的形式验证

X9T5Q-L7V8D-J2F3M-N1K4R-P6Z7Y

我们分析一下激活码的特征

  • 前四组 : 由数字 / 字母和一个减号组成 , 对应的正则为 [A-Z0-9]{5}-
  • 最后一组 : 只由数字 / 字母组成 , 对应的正则为 [A-Z0-9]{5}

那最终的正则 , 我们就可以使用小括号将需要重复使用的正则括起来 , 这样就能重复使用了

([A-Z0-9]{5}-){4}[A-Z0-9]{5}

public class Main {
    public static void main(String[] args) {
        // 验证 Windows 激活码是否正确
        // 特征: 前四组由 数字/字母 和 - 组成, 最后一组由 数字/字母 组成
        System.out.println("X9T5Q-L7V8D-J2F3M-N1K4R-P6Z7Y".matches("([A-Z0-9]{5}-){4}[A-Z0-9]{5}"));
    }
}

2.6 字符串中常用含有正则表达式的方法

String[] split (String regex) : 将当前字符串中匹配 regex 正则表达式的符号作为分隔符来切割字符串

String replaceAll (String regex , String newStr) : 将当前字符串中匹配 regex 正则表达式的字符串替换成 newStr

案例 1 : 将字符串按照数字进行切割

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        // 将字符串按照数字进行切割
        String str = "a1b2c3d4e5f6g7h8i9j10";
        // 通过正则表达式, 匹配 str 字符串中的数字, 按照数字切割字符串
        // \d: 任何数字, [0-9] 的简写
        // +: 出现一次或多次
        String[] strs = str.split("\\d+");
        System.out.println(Arrays.toString(strs));
    }
}

案例 2 : 将字符串中的隐秘信息替换成 *

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        // 将字符串中的隐秘信息替换成 *
        String str = "账号: 10086 密码: 10010";

        // \d: 任何数字, [0-9] 的简写
        // {n,}: 至少出现 n 次
        String encipher = str.replaceAll("\\d{3,}", "*");
        System.out.println("加密后的信息为 : " + encipher);
    }
}


对于正则表达式的简单介绍就结束了 , 后续可以通过一些工具自动生成正则表达式 .
如果这篇文章对你有帮助的话 , 还请一键三连~ 您的支持是对我最大的鼓舞
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2115927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

xcode打包报错之 zip fail / copy fail

在xcode中archive打包中&#xff0c;遇到提示zip fail或者copy fail&#xff0c;此时请清理你电脑的缓存文件了&#xff0c;但凡遇到这两种报错&#xff0c;是编译时运行内存不够导致的&#xff0c;请及时查看并清理你的电脑。 如下&#xff1a; 将对应的缓存或者垃圾清理&am…

春日美食汇:基于SpringBoot的订餐平台

2 系统关键技术 2.1JSP技术 JSP(Java脚本页面)是Sun和许多参与建立的公司所提倡的动态web技术。将Java程序添加到传统的web页面HTML文件()。htm,。Html) [1]。 JSP这种能够独立使用的编程语言可以嵌入在html语言里面运行&#xff0c;正因为JSP参照了许多编程语言的特性&#xf…

C++——类与对象(二)

目录 引言 类的默认成员函数 构造函数 1.构造函数的概念 2.注意事项 初始化列表 1.初始化列表的概念 2.注意事项 析构函数 1.析构函数的概念 2.注意事项 拷贝构造函数 1.拷贝构造函数的概念 2.注意事项 运算符重载 1.运算符重载的概念 2.注意事项 赋值运算符…

食家巷桃酥:一口酥脆,回味悠长

在众多的传统糕点中&#xff0c;食家巷桃酥以其独特的魅力脱颖而出&#xff0c;成为了许多人心中的美味记忆。初见食家巷桃酥&#xff0c;那金黄的色泽便让人食欲大增。每一块桃酥都像是一件小小的艺术品&#xff0c;散发着诱人的香气。它的外形饱满&#xff0c;边缘微微隆起&a…

JVM 调优篇1 类的加载器与加载过程

一 基本知识 1.1 JIT&AOT JIT: Just Time compilation 即时编译器 在程序运行时将字节码或中间表示转换为机器代码。 AOT: Ahead of Tmie Compilation &#xff1a; 预编译 在程序运行之前将高级语言代码完全编译成机器代码。 1.2 字面量和符号引用* 字面量&am…

安卓下载工具箱_3.8.1/去浏览器跳转登录就是会员

下载工具箱app是一款支持56种下载协议的安卓万能下载工具,下载工具箱最新版主要提供网络视频解析下载,资源嗅探下载,以及本地视频扫描提取功能,同时提供不常见的视频编辑功能,例如:智能清洗,高帧率/码率等 链接: https://pan.baidu.com/s/1pW0CgmGv9bmzGkBA4rV2oQ?pwdxdby …

群晖NAS安装alist

官方文档&#xff1a;https://alist.nn.ci/zh NAS参考&#xff1a;https://post.smzdm.com/p/an9zpvev/ Windows安装&#xff1a;alist-windows-amd64.zip 手机参考&#xff1a;https://studylessshape.github.io/post/note/alist-install-for-android/ 质感文件可以不用安&…

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述&#xff0c;于2022-01-07发表于Science&#xff0c;主要讨论了癌症中的三级淋巴结构&#xff08;Tertiary Lymphoid Structures, TLS&#xff09;及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称&#xff08;中文&…

前端学习笔记-Web APls篇-04

Dom节点&移动端滑动 1.日期对象 日期对象:用来表示时间的对象作用:可以得到当前系统时间 1.1实例化 在代码中发现了 new 关键字时&#xff0c;一般将这个操作称为实例化 创建一个时间对象并获取时间 获得当前时间 获得指定时间 1.2时间对象方法 使用场景&#xff1a…

图的广度优先搜索(BFS)算法与邻接矩阵表示

图的广度优先搜索(BFS)算法与邻接矩阵表示 1. 图的表示2. 广度优先搜索(BFS)BFS 算法步骤:3. 使用邻接矩阵的 BFS 实现4. 运行时间分析时间复杂度:空间复杂度:5. BFS 使用邻接列表与邻接矩阵的比较BFS 在邻接列表上的运行时间:6. 结论在计算机科学中,图是一种重要的数…

Mybatis-设计模式总结

1、Builder模式 Builder模式的定义是“将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。”&#xff0c;它属于创建类模式&#xff0c;一般来说&#xff0c;如果一个对象的构建比较复杂&#xff0c;超出了构造函数所能包含的范围&#x…

Spring05——注解开发定义bean、Spring纯注解开发模式

19-注解开发定义bean Spring的IOC/DI对应的配置开发前面的内容已经讲解完成&#xff0c;但是使用起来相对来说还是比较复杂的&#xff0c;复杂的地方在配置文件。 Spring到底是如何简化代码开发的呢? 要想真正简化开发&#xff0c;就需要用到Spring的注解开发&#xff0c;Spr…

CTFHub技能树-信息泄露-SVN泄漏

目录 Git与SVN的区别 漏洞产生的原因 漏洞危害 修复建议 工具下载 解题过程 当开发人员使用 SVN 进行版本控制&#xff0c;对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN 泄露漏洞。 Git与SVN的区别 Git 是分布式版本控制系统&a…

vulhub命令执行/代码执行漏洞

一、Thinkphp5 2-rce远程代码执行漏洞 1.打开靶场环境 2、访问网页 3、构造payload 172.16.1.18:8080?s/Index/index/L/${phpinfo()} 4、写入一句话木马&#xff0c;使用蚁剑连接 172.16.1.18:8080/?s/Index/index/name/${print(eval($_POST[cmd]))} 二、Couchdb 任意命令…

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理&#xff0c;在有一定基础认识的前提下&#xff0c;通过阅读kubelet源码&#xff0c;对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管…

【云原生】docker 部署 Doris 数据库使用详解

目录 一、前言 二、数据分析概述 2.1 什么是数据分析 2.2 数据分析目的和意义 2.3 数据分析常用的技术和工具 2.3.1 编程语言 2.3.2 数据处理和分析库 2.3.3 数据可视化工具 2.3.4 数据库系统 2.3.5大数据处理框架 2.3.6 云服务和平台 2.3.7 其他工具 三、Doris介绍…

Hash Table、HashMap、HashSet学习

文章目录 前言Hash Table&#xff08;散列表&#xff09;基本概念散列函数散列冲突&#xff08;哈希碰撞&#xff09;拉链法红黑树时间复杂度分析 HashMap基础方法使用基本的增删改查其他的方法 实现原理 HashSet基础操作去重原理 前言 本文用于介绍关于Hash Table、HashMap、…

UnLua调用C++函数

一、UnLua调用C全局静态函数 1、新建C类MyLuaUtils&#xff0c;继承BlueprintFunctionLibrary,实现全局静态函数GetInt。 MyLuaUtils.h UCLASS() class LUASHOOTING_API UMyLuaUtils : public UBlueprintFunctionLibrary {GENERATED_BODY()UFUNCTION(BlueprintCallable)static…

leetcode hot100_part17_技巧篇

题目 136.只出现一次的数字 结合题目给的数据特征&#xff0c;使用位运算中的异或^&#xff1b;异或的结果很好记&#xff0c;相互不同就是1&#xff0c;相同就是0&#xff1b;同或一样的 169.多数元素 直接排序了 后面那几个方法不看了&#xff0c;追求效率可以再看&#…

前端工程化详解 包管理工具

前端工程化详解 & 包管理工具 1、工程化体系介绍1.1、 什么是前端工程化1.2、 前端工程化发展 2、脚手架能力2.1 准备阶段2.2 开发阶段2.3 发布流程 3、npm能力3.1 剖析package.json3.1.1 必备属性3.1.2 描述信息3.1.3 依赖配置3.1.4 协议3.1.5 目录&文件相关3.1.5.1 程…