You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:45:03