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

news/2024/9/17 9:04:54/ 标签: 正则表达式

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

正则表达式(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 号码首位不能为 0if (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, 否则就返回 falsepublic 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 的任何一个小写字母开头, 后面跟 adSystem.out.println("aad".matches("[a-z]ad"));// 4. 验证 str 是否以 a-d 或者 m-p 之间的某个字符开头, 后面跟 adSystem.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 以外的其他小写字符开头, 后面跟 adSystem.out.println("vad".matches("[a-z&&[^aeiou]]ad"));// 2. 要求字符串是 a、e、i、o、u 中的某个小写字符开头, 后面跟 adSystem.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.ppmy.cn/news/1522852.html

相关文章

《论面向方面的编程技术及其应用》写作框架,软考高级系统架构设计师

论文真题 随着社会信息化进程的加快&#xff0c;计算机及网络已经被各行各业广泛应用&#xff0c;信息安全问题也变得愈来愈重要。它具有机密性、完整性、可用性、可控性和不可抵赖性等特征。信息系统的安全保障是以风险和策略为基础&#xff0c;在信息系统的整个生命周期中提…

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

Course1-Week1: https://github.com/kaieye/2022-Machine-Learning-Specialization/tree/main/Supervised%20Machine%20Learning%20Regression%20and%20Classification/week11️⃣线性回归&#xff08;linear regression&#xff09; f w , b ( x ) w x b f_{w,b}(x) wx b …

85、 探针

一、pod的进阶 pod的进阶&#xff1a; 1.1、pod的生命周期当中的状态&#xff1a; 1、Running运行中&#xff0c;pod已经分配到节点上且pod内的容器正常运行。正常状态&#xff08;ready 1/1&#xff09;。 2、complete&#xff1a;完成之后退出&#xff0c;容器内的返回码…

python获取音频文件采样率的方法

在 Python 中&#xff0c;你可以使用多种库来获取音频文件的采样率&#xff08;sampling rate&#xff09;。常见的音频文件格式包括 .wav、.mp3、.flac 等。对于不同的音频文件格式&#xff0c;可以使用不同的库来处理。以下是一些常见的库和对应的方法&#xff1a; 1. 使用 w…

pytest压力测试:不断发送数据,直到发现数据丢失

示例场景 假设有一个 send_data 函数接受数据并返回成功或失败的状态。 创建一个测试用例&#xff0c;通过逐步增加数据量来测试这个函数&#xff0c;直到返回失败为止。 步骤 定义压力测试函数 定义一个函数。不断发送数据&#xff0c;直到发现数据丢失。 创建 pytest 测试…

电脑驱动分类

电脑驱动程序&#xff08;驱动程序&#xff09;是操作系统与硬件设备之间的桥梁&#xff0c;用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类&#xff1a; 1. 设备驱动程序 显示驱动程序&#xff1a;控制显卡和显示器的显示功能&#xff0c;负责图形渲染和…

Java并发编程实战 07 | 如何正确停止线程

什么时候需要停止一个线程&#xff1f; 一个线程被创建并启动之后&#xff0c;大部分情况下都会自然运行至结束&#xff0c;但是也有一些情况需要主动停止线程&#xff0c;比如&#xff1a; 用户主动取消执行&#xff1a;用户可能会中止一个正在进行的操作&#xff0c;这时需…

python---爬取QQ音乐

如Cookie为非vip&#xff0c;仅能获取非vip歌曲 1.下载包 pip install jsonpath 2.代码 import os import time import requests from jsonpath import jsonpathdef search_and_download_qq_music(query_text):headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; …

网络层ip协议

一.概念 ip协议主要是为了在复杂的网络环境中确定一个合适的路径来传输主机间的数据。简单来说就是用来确定主机的位置。 ip协议中的一些设备如下&#xff1a; 主机: 配有 IP 地址, 但是不进行路由控制的设备;路由器: 即配有 IP 地址, 又能进行路由控制;节点: 主机和路由器的统…

vue多环境配置和打包

件名的后缀来指定它们仅在特定模式下被加载。 .env&#xff1a;所有环境下都会加载的通用配置。 .env.local&#xff1a;本地覆盖配置&#xff0c;不加入版本控制。 .env.[mode]&#xff1a;仅为指定的模式加载的配置文件&#xff0c;例如.env.development、.env.production、…

Claude Enterprise推出计划

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

探究零工市场小程序如何改变传统兼职模式

近年来&#xff0c;零工市场小程序正逐渐改变传统的兼职模式&#xff0c;为求职者和雇主提供了一个更为高效、便捷的平台。本文将深入探讨零工市场小程序如何影响传统兼职模式&#xff0c;以及它带来的优势和挑战。 一、背景与挑战 传统的兼职市场往往存在信息不对称的问题&am…

本地Gitblit使用

首先创建一个本地的gitblit的服务&#xff0c;创建流程如下&#xff1a; 【GitBlit】Windows搭建Git服务器详细教程_搭建gitblit服务-CSDN博客 GitBlit的使用教程-CSDN博客 创建好一个仓库后&#xff0c;分配好用户权限&#xff0c;再将项目拉下来&#xff0c;这里是再visua…

C++如何创建一个单例模式的类

单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;其核心目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。单例模式通常用于管理共享资源&#xff0c;如配置文件、线程池、缓存等。在C中&#xff0c;创建一个…

页面小组件-表格封装(基础版)

说明 这一版封装的主要原因是当时有很多报表&#xff0c;数据列很多很多&#xff0c;基本在二十个左右。相应领导安排简洁代码&#xff0c;也为了偷懒&#xff0c;直接插槽循环搞起。其余是为了统一样式修改。 组件源码 <template><el-tablev-loading"loading…

DML、DQL、DCL的基础介绍

1.DML、DQL、DCL 1.1DML-介绍 DML英文全称Data Manipulation Language&#xff08;数据操作语言&#xff09;&#xff0c;用来对数据库中表的数据记录进行增删改操作 添加数据&#xff08;INSERT&#xff09;修改数据&#xff08;UPDATE&#xff09;删除数据&#xff08;DEL…

docker 启动容器报错 Error response from daemon: network XXX not found

华为的云服务器,重启后启动容器报上述错误 可能是容器依赖的网络被删除了 查看现有网络 docker network ls docker run -it \-p 80:80 \-p 443:443 \--name nginx \--network app --hostname nginx \-e TZAsia/Shanghai \--add-host adminJar:192.168.0.169 \-v /guazai/do…

比特币客户端和API

1. 比特比客户端的安装 Bitcoin Core 客户端适用于从 x86 Windows 到 ARM Linux 的不同架构和平台&#xff0c;如下图所示&#xff1a; 2. Bitcoin Core客户端的类型 2.1 Bitcoind Bitcoind 末尾的字母 d 表示 daemon (守护程序&#xff09;。所谓守护程序&#xff0c;就是指常…

线程相关内容

线程 一、介绍二、thread库1、构造函数&#xff08;1&#xff09;函数&#xff08;2&#xff09;说明&#xff08;3&#xff09;注意 2、join函数3、detach4、joinable函数5、get_id函数 三、mutex的种类1、mutex&#xff08;1&#xff09;介绍&#xff08;2&#xff09;lock&a…

从JavaScript入门Go三

前情提要 上一章中我们讲了Go中的变量与函数&#xff0c;这一节我们说说Go中的逻辑语法for、if、switch。最近正好有空&#xff0c;正好给大家更新一下入门的第三章。 PS&#xff1a;没看过的第一章、第二章的小伙伴&#xff0c;可以进入下面的链接查看 从JavaScript入门Go一 从…