正则表达式超详细使用指南

2022年6月24日学习笔记评论18,123字数 9140阅读30分28秒阅读模式

2022-06-24_13-01-32

相信我,只要你开始接触编程相关的,你肯定无法避开正则表达式

这玩意吧,大多数时候直接复制就可以解决问题,也没专门的课程讲这个,很容易导致对这块知识一知半解。

不过真的去了解下,发现学起来也不难,而且学会了对工作和生活都很有帮助,只是刚开始学会觉得有点费劲。

下面是我参考网上资料整理的正则表达式学习笔记,主要用于自用,也顺便分享出来,有需要的可以参考学习。

正则表达式速查表

字符

表达式 描述
[abc] 字符集。匹配集合中所含的任一字符。
[^abc] 否定字符集。匹配任何不在集合中的字符。
[a-z] 字符范围。匹配指定范围内的任意字符。
. 匹配除换行符以外的任何单个字符。
\ 转义字符。
\w 匹配任何字母数字,包括下划线(等价于[A-Za-z0-9_])。
\W 匹配任何非字母数字(等价于[^A-Za-z0-9_])。
\d 数字。匹配任何数字。
\D 非数字。匹配任何非数字字符。
\s 空白。匹配任何空白字符,包括空格、制表符等。
\S 非空白。匹配任何非空白字符。

分组和引用

表达式 描述
(expression) 分组。匹配括号里的整个表达式。
(?:expression) 非捕获分组。匹配括号里的整个字符串但不获取匹配结果,拿不到分组引用。
\num 对前面所匹配分组的引用。比如(\d)\1可以匹配两个相同的数字,(Code)(Sheep)\1\2则可以匹配CodeSheepCodeSheep

锚点/边界

表达式 描述
^ 匹配字符串或行开头。
$ 匹配字符串或行结尾。
\b 匹配单词边界。比如Sheep\b可以匹配CodeSheep末尾的Sheep,不能匹配CodeSheepCode中的Sheep
\B 匹配非单词边界。比如Code\B可以匹配HelloCodeSheep中的Code,不能匹配HelloCode中的Code

数量表示

表达式 描述
? 匹配前面的表达式0个或1个。即表示可选项。
+ 匹配前面的表达式至少1个。
* 匹配前面的表达式0个或多个。
| 或运算符。并集,可以匹配符号前后的表达式。
{m} 匹配前面的表达式m个。
{m,} 匹配前面的表达式最少m个。
{m,n} 匹配前面的表达式最少m个,最多n个。

预查断言

表达式 描述
(?=) 正向预查。比如Code(?=Sheep)能匹配CodeSheep中的Code,但不能匹配CodePig中的Code
(?!) 正向否定预查。比如Code(?!Sheep)不能匹配CodeSheep中的Code,但能匹配CodePig中的Code
(?<=) 反向预查。比如(?<=Code)Sheep能匹配CodeSheep中的Sheep,但不能匹配ReadSheep中的Sheep
(?<!) 反向否定预查。比如(?<!Code)Sheep不能匹配CodeSheep中的Sheep,但能匹配ReadSheep中的Sheep

特殊标志

表达式 描述
/.../i 忽略大小写。
/.../g 全局匹配。
/.../m 多行修饰符。用于多行匹配。

正则表达式在线可视化工具

https://jex.im/regulex/

2022-06-24_13-01-58

打开站长主页,发现只有一句话:

2022-06-24_13-02-52

大概意思是:他已经死了。 他恨他的父母, 他讨厌他的高中。

(不知道仅仅是在描述事实,还是带有情绪化的表达,看到觉得有点悲伤)

正则表达式实际应用案例

案例是在notepad++中,通过查找替换来应用的。

其它应用领域都差不多,可以自行参考。

案例一

我有一个名单,类似这样:

01_曹楚唯
02_曹珩瑀
03_方熙垚
04_冯奕琳
05_高天勤
06_韩昊宸

我想把前面的数字和“_”删掉。

我们只要把查找目标设定为[0-9][0-9]_,就可以找到所有目标,然后替换为空即可实现。

2022-06-24_10-56-42

还可以把目标设定为^[0-9][0-9]_,强调目标是在行开头,这样即使行后面有其它匹配内容,也不会被找到。

案例二

复制的网页内容,有网站的链接,该如何批量删掉呢?

比如我现在有这一段内容:

本笔记来自设计笔记(shejibiji.com)
本笔记来自设计笔记(www.shejibiji.com)
本笔记来自设计(shejibiji.com)

我想把网站名和地址都换成我自己的内容,或者都直接删掉。

我可以把查找目标定为设计([笔记]*?)\((\w*\.?)\w*\.\w*\),这样就可以匹配到上面三种不同的网址形式,再替换为自己的即可。

2022-06-24_12-40-03

这个案例的关键是用到?来实现可选项。

有些场景是不支持中文字符,就需要将中文转为Unicode码,再去匹配,结果是一样的。

比如设计([笔记]*?)\((\w*\.?)\w*\.\w*\)

可以改成:\u8BBE\u8BA1([\u7B14\u8BB0]*?)\((\w*\.?)\w*\.\w*\)

案例三

批量删除固定网址的不同内容

比如我想删除所有失效的阿里云图床图片,格式大概是这样的:

https://ae01.alicdn.com/kf/Hd6f6e0acc0cc41b099c2e6cfe0eba15eo.jpg
https://ae01.alicdn.com/kf/H54a6a1602b494e0bb3ef43793013e72b9.jpg
https://ae01.alicdn.com/kf/H6964a1db80af4f0f8a6900d2800f98a29.jpg

分析网址前面是固定的,主要是后面的图片地址不同,只要用一个\w*来替代那部分即可匹配所有。

那么查找目标设定为https://ae01.alicdn.com/kf/(\w*).jpg即可。

更多案例

待补充……

常用正则表达式示例

数字校验

描述 正则表达式 备注
数字 ^[0-9]*$  
n位数字 ^\d{n}$  
至少n位数字 ^\d{n,}$  
m~n位数字 ^\d{m,n}$  
整数 ^(-?[1-9]\d*)$ 非0开头,包括正整数和负整数
正整数 ^[1-9]\d*$  
负整数 ^-[1-9]\d*$  
非负整数 ^(([1-9]\d*)|0)$  
非正整数 ^((-[1-9]\d*)|0)$  
浮点数 ^-?(?:[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0\.0+|0)$ 包括正浮点数和负浮点数
正浮点数 ^(?:[1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  
负浮点数 ^-(?:[1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  
非正浮点数 ^(?:-(?:[1-9]\d*\.\d+|0\.\d*[1-9]\d*)|0\.0+|0)$ 包含0
非负浮点数 ^(?:[1-9]\d*\.\d+|0\.\d+|0\.0+|0)$ 包含0
仅一位小数 ^-?(?:0|[1-9][0-9]*)\.[0-9]{1}$  
最少一位小数 ^-?(?:0|[1-9][0-9]*)\.[0-9]{1,}$  
最多两位小数 ^-?(?:0|[1-9][0-9]*)\.[0-9]{1,2}$  
连续重复的数字 ^(\d)\1+$ 例如:111222

字符校验

描述 正则表达式 备注
中文 ^[\u4E00-\u9FA5]+$  
全角字符 ^[\uFF00-\uFFFF]+$  
半角字符 ^[\u0000-\u00FF]+$  
英文字符串(大写) ^[A-Z]+$  
英文字符串(小写) ^[a-z]+$  
英文字符串(不区分大小写) ^[A-Za-z]+$  
中文和数字 ^(?:[\u4E00-\u9FA5]{0,}|\d)+$  
英文和数字 ^[A-Za-z0-9]+$  
数字、英文字母或者下划线组成的字符串 ^\w+$  
中文、英文、数字包括下划线 ^[\u4E00-\u9FA5\w]+$  
不含字母的字符串 ^[^A-Za-z]*$  
连续重复的字符串 ^(.)\1+$ 例如:aabb
长度为n的字符串 ^.{n}$  
ASCII ^[ -~]$  

日期和时间校验

描述 正则表达式 备注
日期 ^\d{1,4}-(?:1[0-2]|0?[1-9])-(?:0?[1-9]|[1-2]\d|30|31)$ 弱校验,例如:2022-06-12
日期 ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$ 严格校验,考虑平闰年
时间 ^(?:1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d$ 12小时制,例如:11:21:31
时间 ^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$ 24小时制,例如:23:21:31
日期+时间 ^(\d{1,4}-(?:1[0-2]|0?[1-9])-(?:0?[1-9]|[1-2]\d|30|31)) ((?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d)$ 例如:2000-11-11 23:20:21

日常生活相关

描述 正则表达式 备注
中文名 ^[\u4E00-\u9FA5·]{2,16}$  
英文名 ^[a-zA-Z][a-zA-Z\s]{0,20}[a-zA-Z]$  
车牌号 ^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]$ 不含新能源
车牌号 ^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z](?:(?:[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳])|(?:(?:\d{5}[A-HJK])|(?:[A-HJK][A-HJ-NP-Z0-9][0-9]{4})))$ 包含新能源
火车车次 ^[GCDZTSPKXLY1-9]\d{1,4}$ 例如:G1234
手机号 ^(?:(?:\+|00)86)?1[3-9]\d{9}$ 弱匹配
手机号 ^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$ 严格匹配
固话号码 ^(?:(?:\d{3}-)?\d{8}|^(?:\d{4}-)?\d{7,8})(?:-\d+)?$  
手机IMEI码 ^\d{15,17}$ 一般是15位
邮编 ^(?:0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$ 例如:211100
统一社会信用代码 ^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$  
身份证号码(1代) ^[1-9]\d{7}(?:0\d|10|11|12)(?:0[1-9]|[1-2][\d]|30|31)\d{3}$ 15位数字
身份证号码(2代) ^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[0-9Xx]$ 18位数字
QQ号 ^[1-9][0-9]{4,}$ 一般是5到10位
微信号 ^[a-zA-Z][-_a-zA-Z0-9]{5,19}$ 一般6~20位,字母开头,可包含字母、数字、-、_,不含特殊字符
股票代码 ^(s[hz]|S[HZ])(000[\d]{3}|002[\d]{3}|300[\d]{3}|600[\d]{3}|60[\d]{4})$ A股,例如:600519
银行卡卡号 ^[1-9]{1}(?:\d{15}|\d{18})$ 一般为19位

互联网相关

描述 正则表达式 备注
域名 ^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$ 例如:r2coding.com
网址 ^(?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$ 例如:https://www.r2coding.com/
带端口号的网址(或IP) ^(?:https?:\/\/)?[\w-]+(?:\.[\w-]+)+:\d{1,5}\/?$ 例如:http://127.0.0.1:8888/
URL ^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)$ 例如:https://www.r2coding.com/#/README?id=1
邮箱email ^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$ 支持中文,例如:codesheep@cs.com
用户名 ^[a-zA-Z0-9_-]{4,20}$ 4到20位
弱密码 ^[\w]{6,16}$ 6~16位,包含大小写字母和数字的组合
强密码 ^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@\.#$%^&*? ]).*$ 至少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
端口号 ^(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ 例如:65535
IPv4地址 ^(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$ 例如:192.168.31.1
IPv4地址+端口 ^(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$ 例如:192.168.31.1:8080
IPv6地址 ^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$ 例如:CDCD:910A:2222:5498:8475:1111:3900:2020
IPv6地址+端口 ^\[(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\](?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$ 例如:[CDCD:910A:2222:5498:8475:1111:3900:2020]:9800
子网掩码 ^(?:254|252|248|240|224|192|128)\.0\.0\.0|255\.(?:254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(?:254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(?:255|254|252|248|240|224|192|128|0)$ 例如:255.255.255.0
MAC地址 ^(?:(?:[a-f0-9A-F]{2}:){5}|(?:[a-f0-9A-F]{2}-){5})[a-f0-9A-F]{2}$  
Version版本号 ^\d+(?:\.\d+){2}$ 例如:12.1.1
图片后缀 \.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif)+ 可按需增删扩展名集合
视频后缀 \.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4)+ 可按需增删扩展名集合
图片链接 (?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.+\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif) 可按需增删扩展名集合
视频链接 (?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.+\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4) 可按需增删扩展名集合
迅雷链接 thunderx?:\/\/[a-zA-Z\d]+=  
ed2k链接 ed2k:\/\/\|file\|.+\|\/  
磁力链接 magnet:\?xt=urn:btih:[0-9a-fA-F]{40,}.*  
  • 其他
描述 正则表达式 备注
MD5格式 ^(?:[a-f\d]{32}|[A-F\d]{32})$ 32位MD5,例如:7552E7071B118CBFFEC8C930455B4297
BASE64格式 ^\s*data:(?:[a-z]+\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s]*?)\s*$ 例如:data:image/jpeg;base64,xxxx==
UUID ^[a-f\d]{4}(?:[a-f\d]{4}-){4}[a-f\d]{12}$ 例如:94f9d45a-71b0-4b3c-b69d-20c4bc9c8fdd
16进制 ^[A-Fa-f0-9]+$ 例如:FFFFFF
16进制颜色 ^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ 例如:#FFFFFF
SQL语句 ^(?:select|drop|delete|create|update|insert).*$  
Java包名 ^(?:[a-zA-Z_]\w*)+(?:[.][a-zA-Z_]\w*)+$ 例如:com.r2coding.controller
文件扩展名 \.(?:doc|pdf|txt) 可按需增删扩展名集合
Windows文件路径 ^[a-zA-Z]:(?:\\[\w\u4E00-\u9FA5\s]+)+[.\w\u4E00-\u9FA5\s]+$ 例如:C:\Users\Administrator\Desktop\a.txt
Windows文件夹路径 ^[a-zA-Z]:(?:\\[\w\u4E00-\u9FA5\s]+)+$ 例如:C:\Users\Administrator\Desktop
Linux文件路径 ^\/(?:[^/]+\/)*[^/]+$ 例如:/root/library/a.txt
Linux文件夹路径 ^\/(?:[^/]+\/)*$ 例如:/root/library/

搜索高阶技巧:利用正则表达式搜索更多相关信息 技巧分享

搜索高阶技巧:利用正则表达式搜索更多相关信息

常用搜索功能的小伙伴应该经常有这样一个需求,想搜索某句话,但中间某几个字忘了,普通的搜索功能肯定就无法满足这个要求了。 这个时候就可以考虑使用正则表达式来实现跨字符串搜索。今天就让我们一起来学习下这个...
如何获取网站的图片及文件上传接口 学习笔记

如何获取网站的图片及文件上传接口

图片与文章内容无关 之前有一个图床程序,利用的是公共的图片上传接口。 最近测试了下,发现有一些不能用了,我就在想该如何获取到新的图片上传接口呢? 根据我最近学到的一些知识,其实图片上传原理都是差不多:...
宝塔面板如何通过IP直接访问网站目录? 学习笔记

宝塔面板如何通过IP直接访问网站目录?

最近有个服务器要过期了,于是我想最后利用一下这个服务器测试下新开发的小项目。 但是我又不想解析域名给他。 那该如何通过服务器的IP,直接访问到网站的目录完成测试呢? 如果我们直接在宝塔面板中创建站点,...

发表评论