IE11环境下不使用负向后行断言提取非$前缀数字的正则问题
提问内容
提问前我查阅了相关往期问题,当前我需要编写一个可在IE11中运行的正则表达式,提取所有未被$符号作为前缀的数字。由于IE11不支持负向后行断言,因此无法使用该特性。
我的测试字符串如下:
2 burgers and 3 drinks would be $15 The cost of 2 burgers and 3 drinks are $15
我需要从上述两个字符串中提取出2,3。
参考往期帖子我编写了如下正则:
/((?!([\$]))^)\d+|(?:[^\$])\b\d+/gm
我不确定该正则是否完全正确,另外它的匹配结果会包含空格,虽然我可以后续替换空格,但我想知道是否有方法可以直接匹配到不含空格的数字,我的当前实现代码如下:
var x = 'The cost of 2 burgers and 3 drinks are $15' var y = x.match(/((?!([\$]))^)\d+|(?:[^\$])\b\d+/gm); var z = y.toString().replace(/ /gm,'');
提前感谢各位的解答。
解答
你当前写的正则会匹配到数字前的空格,是因为非捕获组(?:[^\$])会将数字前的非$字符(如空格)一并纳入全匹配结果,才需要额外做空格替换。
兼容IE11的最优方案
我们可以通过捕获组单独提取目标数字,完全不需要用到负后向断言,也不需要后续做字符替换,代码如下:
var str = 'The cost of 2 burgers and 3 drinks are $15'; var reg = /(?:^|[^$])(\d+)/g; var res = []; var match; while ((match = reg.exec(str)) !== null) { res.push(match[1]); } // 如需转成逗号分隔的字符串,直接调用 res.join(',') 即可
正则逻辑说明
(?:^|[^$])是非捕获组,仅做匹配前置条件校验:要么是行开头位置,要么是任意非$的字符,这部分内容不会进入捕获组(\d+)是第一个捕获组,匹配我们需要的纯数字,直接提取该组内容就不会附带前置的空格等字符- 全程未使用任何IE11不支持的正则特性,兼容所有老版本浏览器
测试验证
针对你给出的两个测试用例,最终提取结果均为['2','3'],完全符合需求。
内容的提问来源于stack exchange,提问作者smpa01
相关产品推荐
相关产品推荐

