当涉及到处理文本数据时,正则表达式是一种非常强大的工具。它可以帮助我们在字符串中搜索、匹配和替换特定的模式。
在这篇博客中,我总结了一些常见的正则表达式基础知识,旨在帮助读者更好地理解和应用正则表达式。
限定符
语法 | 描述 |
---|---|
a* | a 出现0次或多次 |
a+ | a 出现1次或多次 |
a? | a 出现0次或1次 |
a{6} | a 出现6次 |
a{2,6} | a 出现2-6次 |
a{2,} | a 出现两次以上 |
或运算符
语法 | 描述 |
---|---|
(a | b) | 匹配 a 或者 b |
(ab) | (cd) | 匹配 ab 或者 cd |
字符类
语法 | 描述 |
---|---|
[abc] | 匹配 a 或 b 或 c |
[a-c] | 与上式意义相同 |
[a-fA-F0-9] | 匹配大小写的 a 到 f以及数字 |
[^0-9] | 匹配非数字字符 |
元字符
语法 | 描述 |
---|---|
\d | 匹配数字字符 |
\D | 匹配非数字字符 |
\w | 匹配单词字符(英文,数字,下划线) |
\W | 匹配非单词字符 |
\s | 匹配空白符(包含换行符,tab) |
\S | 匹配非空白符 |
. | 匹配任意字符 |
\b | 标注字符的边界,全字匹配 |
^ ,$ | 匹配行首,行尾 |
贪婪/懒惰匹配
所谓懒惰匹配,就是匹配尽可能少的字符.
语法: *?
或者 +?
; ?
表示懒惰模式,必须跟在*
或者+
后面使用.
例如: 测试字符串 ,当我们使用 a.*b
去匹配时, 得到的结果为 ,而当我们使用a.*?b
去匹配,会得到和两个结果.
捕获与预查
()
可以捕获符合子表达式的字符串
例如: 使用(\d{4})-(\d{2})-(\d{2})
去测试字符串2021-12-13,返回结果为['2021-12-13','2021','12','13']
(?:)
可以不捕获符合子表达式的字符串
例如: 使用(\d{4})-(?:\d{2})-(\d{2})
去测试字符串2021-12-13,返回结果为['2021-12-13','2021','13']
exp1(?=exp2)
正向预查: 匹配在exp2
之前的exp1
.
例如: a(?:b)
表示匹配一个,并且后面要紧跟.
exp1(?!exp2)
负向预查: 匹配后面不是exp2
的exp1
.
例如: a(?!b)
表示匹配一个,并且后面不能是.
例如: ^(?!dog)(?!cat).{2,6}$
表示匹配不以dog
和cat
开头的2~6个字符.
应用场景示例
-
中文正则表达式:
[\u4E00-\u9FA5]
-
十六进制颜色:
^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$
-
密码强度校验:
- 弱:6~15位的纯数字,纯小写字母或纯大写字母:
(\d{6,10})|([a-z]{6,10}|([A-Z]){6,15})
- 中:6~15位的数字+字母,字母+特殊,数字+特殊:
(?![\d]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$).{6,15}
解释:
(?![\d]+$)
排除纯数字,(?![a-zA-Z]+$)
排除纯字母,(?![^\da-zA-Z])
排除纯特殊字符串- 强:6~15位,包含大写字母和特殊字符:
^(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{6,15}
- 弱:6~15位的纯数字,纯小写字母或纯大写字母:
-
用户名:
[a-zA-Z0-9_-]{4,16}
JavaScript中动态拼接正则
在JavaScript中我们不能使用常规的字符串拼接方式来拼接正则表达式,必须借助eval
方法才能正确拼接.
var con = "[\d]+";
var regCor = eval(`/${con}/`);
var regErr = "/" + con + "/";
console.log(regCor.test("321321")); // True
consolg.log(regErr.test("321321")); // Error: test not a function
eval()
: 函数会将传入的字符串当做 JavaScript 代码进行执行。
reg.test(str)
: 测试 reg 是否匹配 str ,可以返回 True ,反之返回 False
reg.exec(str)
: 测试 reg 是否匹配 str ,返回一个数组,第一项为完整的匹配内容,后面的项为子匹配.
参考资料与练手习题
力扣练手题:
字节面试:
千位分隔符转换,即将 转化为 的形式。
let rawNum = "100000"
let regex = /\B(?=(\d{3})+$)/g;
console.log(rawNum.replace(regex, ','))
正则表达式 /\B(?=(\d{3})+$)/g
的含义如下:
\B
:匹配非单词边界,表示匹配一个位置,该位置前后都是数字字符或非数字字符。(?=(\d{3})+$)
:正向肯定预查,表示匹配一个位置,该位置后面是以每三个数字为一组的结尾。