JavaScript 正则表达式:深入理解懒惰性与贪婪性
本文详细解析JavaScript中正则表达式的exec与match方法。重点阐述正则捕获的懒惰性(默认仅捕获首个结果)及其通过全局修饰符g的解决策略,同时解释贪婪模式如何匹配最长字符串及利用问号?切换为懒惰模式的方法。结合代码示例,展示如何完整获取所有匹配内容。
正则表达式捕获基础与exec方法
exec 方法用于执行正则表达式的捕获操作。
每次进行捕获时,系统会先执行默认匹配。若未找到匹配项,捕获结果为 null;只有存在匹配内容时,才能成功捕获。
捕获结果的格式如下:
1. 捕获到的内容是一个数组,该数组的第一项即为当前正则表达式捕获到的具体内容。
index 属性表示捕获内容在原字符串中开始位置的索引值。
input 属性保存原始被匹配的字符串。
var reg = /\d+/;
var str = 'woshi2016ni2017';
var res = reg.exec(str);
console.log(res) // ['2016',index:5,input:'woshi2016ni2017']
//第二次通过exec捕获的内容还是第一个"2016"
var res = reg.exec(str);
console.log(res) // ['2016',index:5,input:'woshi2016ni2017']
正则捕获的懒惰性与全局修饰符g
2. 正则表达式捕获的两个主要特点:
1)懒惰性:每次执行 exec 仅捕获第一个匹配到的内容。若不进行额外处理,多次调用 exec 始终返回第一个匹配结果。
lastIndex 属性记录正则表达式每次在字符串中开始查找的位置,其默认值为 0。
2)如何解决懒惰性?在正则表达式末尾添加修饰符 "g" 即可。
常用的正则修饰符包括:g、i、m。
global (g):启用全局匹配模式。
ignoreCase (i):启用忽略大小写的匹配模式。
multiline (m):启用多行匹配模式。
var reg = /\d/g;
var str = 'woshi2016ni2017';
console.log(reg.lastIndex)
console.log(reg.exec(str))
原理说明:当添加全局修饰符 g 后,正则表达式每次捕获结束后,lastIndex 的值会更新为最新位置。下一次捕获将从该新位置开始查找,从而能够获取所有需要捕获的内容。
3)通过编写程序获取正则表达式捕获的所有内容(务必记得添加 g 修饰符)。
var reg = /\d+/g;
var str = 'aswofde2015xsewde2016awdefer2017';
var ary = [];
var res = reg.exec(str);
while(res){
ary.push(res[0])
res = reg.exec(str);
}
console.log(ary)//[2015,2016,2017]
正则的贪婪性与懒惰模式切换
4)贪婪性:正则表达式在每次捕获时,默认按照匹配最长的结果进行捕获。例如,字符串 "2" 和 "2015" 均符合正则,但默认情况下会捕获较长的 "2015"。
5)如何解决正则的贪婪性?在量词元字符后添加问号 "?" 即可。
var reg = /\d+?/g;
var str = 'aswofde2015xsewde2016awdefer2017';
console.log(reg.exec(str));
"?" 在正则表达式中有多种作用:
放在普通元字符后面,代表该字符出现 0 到 1 次。例如 /\d?/ 表示数字可能出现也可能不出现。
放在量词元字符后面,用于取消捕获时的贪婪性,使匹配变为懒惰模式。
match方法与exec的对比
3. 字符串中的 match 方法:用于获取所有与正则表达式匹配的字符。
var reg = /\d+?/g;
var str = 'aswofde2015xsewde2016awdefer2017';
var ary = str.match(reg);//[2,0,1,5,2,0,1,6,2,0,1,7]
虽然在当前场景下 match 比 exec 更为简便,但 match 存在无法自行处理的问题。在涉及分组捕获的情况下,match 只能捕获大正则匹配的内容,而无法获取小正则(子组)捕获的内容。
以上介绍了 JavaScript 中正则表达式的懒惰性和贪婪性,希望对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
