现在 AI 都那么强大了我还为什么需要去学习正则表达式这个烦人的东西呢?
问 AI:打开浏览器 -> 输入 chat.xxx.com -> 登录 -> 输入问题 ->得到答案
靠自己 🧠: 输入问题 -> 得到答案
简单明了可以看出来对于一些简单的东西如果掌握了,会大大减少得到问题答案的 ⏱


下面说明的表达式是运行在 javascript 环境下的
正则表达式只能处理字符串,懂了没,字符串!!!

推荐使用 vscode 插件,可以在线测试正则表达式的匹配字符串
image.png

编写

1
2
3
4
5
//=>字面量创建方式(两个斜杠之间包起来的,都是用来描述规则的元字符)
let reg1 = /\d+/;

//=>构造函数模式创建 两个参数:元字符字符串,修饰符字符串
let reg2 = new RegExp('\\d+');

组成

量词元字符

设置字符出现的次数

符号 含义
* 任意次(包括 0 次)
+ 至少出现一次
? 0 次或 1 次
{n} 出现 n 次
{n,} 至少出现 n 次
{n,m} 出现了 n~m 次

特殊元字符

单个或者组合再一起代表特殊的含义

符号 说明
\ 转义字符
. 除了 \n(换行符) 以外的任意字符
^ 以哪个元字符作为开始
$ 以哪个元字符作为结束
\n 换行符
\d 0~9 之间的一个数字
\D 非 0~9 之间的一个数字(大小写意思是相反)
\w 数字、字母、下划线中的任意一个字符
\s 一个空白字符(包含空格、制表符、换页符等)
\t 一个制表符(TAB 键:4 个字符)
\b 匹配一个单词的边界
x|y x 或者 y 其中一个字符
[xyz] x、y、z 其中一个字符
[^xy] 除了 x 和 y 以外的任意字符
[a-z] 指定 a~z 这个范围中的任意字符 [0-9a-zA-Z_]===\w
[^a-z] 上一个的取反 “非”
() 分组符号 有点像作用域
(?:) 只匹配不捕获
(?=) 正向预查
(?!) 逆向预查

普通元字符

代表本身含义的,就是跟字符串一样的作用

\snailuu\ 匹配的就是 "snailuu"

修饰符

符号 含义
i -> ignoreCase 忽略字符大小写
m -> multiline 多行匹配
g -> global 全局匹配

常见/遇到的正则表达

有效数字

1
2
3
4
5
6
7
8
9
10
11
/*
* 规则分析
* 1.可能出现 + - 号,也可能不出现 [+-]?
* 2.一位0-9都可以,多位首位不能是0 (\d|([1-9]\d+))
* 3.小数部分可能有可能没有,一旦有后面必须有小数点+数字 (\.\d+)?
* 解析:
* ^[+-]? 以+或者-开头0个或1个
* (\d|([1-9]\d+)) 第一位0-9或者第一位是1-9后面跟着多位0-9
* (\.\d+)? 小数部分可能有可能没有,一旦有后面必须有小数点+数字
*/
let reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/;

密码

由数字+字母+下划线组成

1
2
3
4
5
6
7
/**
* 分析
* 数字、字母、下划线构成
* 长度 6~16位
*
*/
let reg = /^\w{6,16}$/;

邮箱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* => \w+((-\w+)|(\.\w+))*
* 1.开头是数字字母下划线(1到多位)
* 2.还可以是 -数字字母下划线 或者 .数字字母下划线,整体零到多次
* =>邮箱的名字由“数字、字母、下划线、-、.”几部分组成,但是-/.不能连续出现也不能作为开始
*
* => @[A-Za-z0-9]+
* 1.@后面紧跟着:数字、字母 (1-多位)
*
* => ((\.|-)[A-Za-z0-9]+)*
* 1.对@后面名字的补充
* 多域名 .com.cn
* 企业邮箱 hzf@snailuu-snailuu-office.com
*
* => \.[A-Za-z0-9]+
* 1. 这个匹配的是最后的域名(.com/.cn/.org/.edu/.net...)
*/
let reg = /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;