正则表达式
用法
创建正则:
js
const regExp = new RegExp(pattern, flags);
// or
// const regExp = /pattern/flags
flags
可选以下三个值:
i
执行对大小写不敏感的匹配g
执行全局匹配m
执行多行匹配
实例方法:
exec
检索字符串中指定的值,返回找到的值,并确定其位置test
检索字符串中指定的值,返回 true 或 falsetoString
返回正则表达式的字符串
语法速记
- 字符组:
[]
, 匹配[]
里面任意一个字符即可 - 字符组区间:
[a-z]
26 个英文字母,[A-Z]
表示大写,[a-zA-Z]
26 个英文字母的大小写,[0-9]
表示数字 - 字符组取反:
[^]
- 数量匹配符:
{}
,{5}
表示出现 5 次,{1,4}
表示出现次数区间在 1-4 之间,{1, }
表示次数出现在 1 次以上 - 量词:
+
: 至少出现一次 等同于{1, }
,*
: 出现 0 次或无数次等同于{0, }
- 分组符:
()
, 例如:(jpg|png|mp3|mp4)
- 转义符:
\
- 数字、字母的快捷表达:
\w, \d, \W, \D
- 特殊字符:
\n, \t, \r, \s
- 开头和结束:
^
以什么字符开头,$
以哪个字符结尾 - 任意字符:
.
- 可选字符:
?
断言
断言 (Assertions) 是正则表达式中用于指定匹配位置必须满足(或不满足)某些条件的特殊语法,它们不会消耗字符(即不会成为匹配内容的一部分)
有四类断言:
- 负向后行断言 (?<!) : 匹配一个位置,该位置前面不是指定的模式
- 负向先行断言 (?!) : 匹配一个位置,该位置后面不是指定的模式
- 正向后行断言 (?<=)
- 正向先行断言 (?=)
例如:
js
/(?<!\$)\d+/.test("$100") // false,因为数字前有$
/\d+(?!%)/.test("100%") // false,数字后有%
不匹配内容
[^\/]+
=> 一串不包含斜杠的字符,例如:
js
// 提取域名
const reg = /^(?:https?:\/\/)?(?:[^\/]+)/i;
// "https://juejin.cn"
"https://juejin.cn/user/123".match(reg)[0];
非贪婪匹配
匹配到第一个字符就停止
(.*?)
js
const reg = /<(.*?)>/;
// <div class="flex">
"<div class="flex">123</div>".match(reg)[0];
匹配后替换
js
str.replace(regExp, replaced);
str.replaceAll(regExp, replaced); // reg 是 global 模式