正则表达式
请注意,本文最近一次更新于:2024-10-05,文章内容可能已经不具有时效性,请谨慎参考
本文最后更新于:2024年10月5日星期六晚上7点11分 +08:00
正则表达式基础
Statement
The author USTC-elbitsiserri has no full ownership to the content of this article.This article is a reorganized and recreated work based on the original resources shared by ych! from the community csdn
It is hereby declared and disclaimed
正则表达式
一图速览本文核心内容
元字符表单
- 所有大写和小写字母、所有数字、所有标点符号和一些其他符号等没有特殊定义的标点符号都是
普通字符
- 元字符查找的是
单个字符
,匹配多个时需要添加量词 - 对于需要匹配元字符本身时,需要进行
转义
元字符 | 含义描述 |
---|---|
. | 查找除了换行和结束符以外的所有字符 |
\ | 将下一个字符标记为一个特殊字符,或一个原义字符,或一个引用 |
/ | 正则边界符 |
^n | 边界符,匹配任何开头为n的字符串,或者表示非的含义 |
n$ | 匹配任何结尾为n的字符串 |
\w | 查找字母、数字、下划线 |
\W | 查找除了字母、数字、下划线的非单词字符 |
\d | 查找数字 |
\D | 查找非数字字符 |
\s | 查找空白字符 |
\S | 查找非空白字符 |
\n | 查找换行符 |
\r | 查找回车符 |
量词 | 表示需要匹配的数量个数 |
? | 表示量词或禁止贪婪 |
[] | 原子表 |
() | 原子组 |
断言匹配 | 相当于匹配条件 |
量词表单
- 量词仅作用于它前面紧跟的字符或组
量词 | 含义描述 |
---|---|
n+ | 匹配任何包含至少一个n的字符串 |
n* | 匹配任何包含零个或多个n的字符串 |
n? | 匹配任何包含零个或一个n的字符串 |
n{X} | 匹配包含X个n的序列的字符串 |
n{X,Y} | 匹配包含X至Y个n的序列的字符串 |
n{X,} | 匹配包含至少X个n的序列的字符串 |
模式修正符
- 模式修正符的作用是改变运行方式
- 模式可以组合使用,并且不区分先后顺序
模式 | 含义描述 |
---|---|
i | 不区分大小写 |
g | 执行全局匹配(意思是查找所有匹配,而非在找到第一个匹配项后就停止。只匹配一个称为不贪婪) |
m | 执行多匹配模式,使边界字符^和$匹配每一行的开头和结尾 |
原子表
- 将中括号[]称为原子表,也称为
字符簇
,表示里面的内容可选。没有中括号就表示完全匹配 - 中括号内用连字符号-可以表示一个字符的范围
- 正则表达式中的大多特殊符号,如果被包含于中括号中,则失去特殊意义,只表示字符本意,但\ [] : ^ - 除外
- ^在原子表中表示取反,例如[ ^\d ]表示除了数字,但在原子表外就仍然表示开头
表达式 | 含义描述 |
---|---|
[0-9] | 查找任何从0到9的数字 |
[a-z] | 查找任何从a-z的字符 |
[abcd] | 查找给定集合内的任何字符 |
[^abcd] | 查找给定集合外的任何字符 |
原子组
正则表达式中以一对括号()包裹的运算内容称为原子组,但也有的()不是原子组的情况
- 用处上述内容想要匹配完整的h标签,就需要使用原子组,而原子表会把不完整的标签也匹配出来
1
2
3
4
5
6
7
8const str = '
<h1>abcd</h1> //标签完整
<h2>efgh</h2>
<h3>ijkl</h4> //标签不完整
';
str.match(/(<h[1-6]>).</\1>/g) //原子组
str.match(/<h[1-6].</h[1-6]>/g) //原子表 - 原子组的引用
- 正则表达式中使用 \ 后面加数字n表示与第n个原子组一致 \1 \2 \3 ,依次从左往右数括号数量即可
- 在replace替换方法中直接使用
$
符号完成引用,$
后面加数字n表示第n个原子组,$n表示匹配到的第n个原子组的内容 - 在replace回调函数中,第一个参数是匹配到的整体剩余参数是原子组的组合,args[0]:匹配到的第一个原子组的内容
1
2
3
4
5
6
7
8const reg1 = /<(h[1-6])>(.*)<\/\1>/ig;
console.log(str.replace(reg1,'$2'))
str.replace(reg,(v,...args)=>{
console.log(v)
console.log(args);;
// v 即是正则匹配到的整体
// args是原子组的组合
})
- 原子组的别名
当觉得$1,$2
不够清晰明了时,可以为原子组起别名
起名:(?<自定义名称>)
使用:$<自定义名称>1
2const reg2 = /<(h[1-6])>(?<two>.*)<\/\1>/ig;
console.log(str.replace(reg2,'$<two>'));贪婪和禁止贪婪
- 当?前面是量词时,例如+*{},表示禁止贪婪
1
2
3
4
5
6// 量词加?表示禁止贪婪,往最少的一个方向去
const str = 'hddddd';
console.log(str.match(/hd+/))
console.log(str.match(/hd+?/));
console.log(str.match(/hd*?/));
console.log(str.match(/hd{2,}?/)); - 当?前面时除了量词以外的普通字符、原子表或者原子组,表示前面内容可选
断言匹配
- 断言就是指明某个字符串前边或者后边,将会出现满足某种规律的字符串
- 断言匹配的()不是原子组,不会出现在匹配结果中
断言 | 含义描述 |
---|---|
?=n | 匹配任何后面紧跟指定字符串n的字符串 |
?!n | 匹配任何后面没有紧跟指定字符串n的字符串 |
?<=n | 匹配任何前面紧跟指定字符串n的字符串 |
?<!n | 匹配任何前面没有紧跟指定字符串n的字符串 |
比如电话号码的模糊匹配问题
1
2
3
4
5const tel = '16378303453'
const reg = /(?<=\d{7})\d{4}/
console.log(tel.replace(reg,(v)=>{
return "*".repeat(4)
}))
正则对象属性lastIndex
- lastIndex:一个整数,表示开始下一次匹配的字符位置
1
2
3
4
5
6
7
8
9
10
11
12
13// 因为exec实际上是一个迭代器,正则有一个lastindex的属性,
// 正则匹配检索到一个之后会暂停,从检索的位置再搜索,lastindex会变化,最后找不到的时候,lastindex为0
// 统计字符出现次数
const str = "hello,world";
const reg = /l/g;
let count = 0;
console.log(reg.lastIndex);
while(res = reg.exec(str)){
count++;
console.log(reg.lastIndex);
}
console.log(reg.lastIndex);
console.log(count);正则对象的方法
方法 含义描述 exec 匹配字符串,返回找到的值,并确定其位置。迭代器,lastIndex test 在所搜索的字符串中是否存在正则表达式模式对应的匹配。返回 true 或 false。正则验证
支持正则表达式的字符串方法
方法 | 含义描述 |
---|---|
match | 找到一个或多个正则表达式的匹配 |
replace | 替环正则表达式匹配的子串 |
split | 根据正则匹配到的内容分割字符串数组 |
search | 搜索字符串中是否存在满足正则的字串,返回索引值 |
$$\begin{aligned}
\mathscr{THE}\quad\mathscr{END}
\end{aligned}$$
您阅读这篇文章共花了:
Invitation
Floral-Sunsunrise
FeynmanDirac
created:12/03/2022
Welcome to Floral-Sunsunrise
This is an identification card as an honored membership of FeynmanDirac
Happy to see you follow FeynmanDirac, enjoy science together
验证码启动中...
备用人机验证