话不多说,先来看一道题
let str = "哈哈2019@2020嘿嘿";
let reg = /\d+/g;
console.log(str.match(reg)); //=>["2019","2020"]
问题来了,\d+代表的一到多次的数字,那为什么捕获的都是长数组,而不是像["2", "0", "1", "9", "2", "0", "2", "0"]这样一个一个捕获呢?
正则捕获的贪婪性:默认情况下,正则捕获的时候,是按照当前正则所匹配的最长结果来获取的
解决方法:
在量词元字符后面设置?:取消捕获时候的贪婪性(按照正则匹配的最短结果来获取)
reg = /\d+?/g;
console.log(str.match(reg)); //=>["2", "0", "1", "9", "2", "0", "2", "0"]
问号在正则中的五大作用:
- 问号左边是非量词元字符:本身代表量词元字符,出现零到一次
- 问号左边是量词元字符:取消捕获时候的贪婪性
- (?:) 只匹配不捕获
- (?=) 正向预查
- (?!) 负向预查
括号在正则中的三大作用:
- 加小括号可以改变优先级,让正则匹配的时候分组匹配
- 小括号在捕获的时候可以分组捕获
- 小括号可以实现分组引用