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

正则捕获重复模式问题:无法完整捕获多运算项字符串内容

解决正则捕获重复分组丢失前序匹配的问题

我懂你遇到的困扰了——用重复捕获组的时候,前面的匹配结果会被后面的覆盖,导致只能拿到最后一组数字和运算符,对吧?

先说说你当前正则的问题:/(?:(\d+)([+]+))+(\d+)/g里的(?:...)是一个重复执行的非捕获组,里面的(\d+)和([+]+)每次匹配都会更新对应的捕获组内容,所以最后一次匹配的22和+会把第一次的1和+覆盖掉,最终只能拿到末尾的几组结果。

下面给你两种实用的解决方案,都能满足你捕获["1+22+33", "1", "+", "22", "+", "33"]的需求,还能兼容多种运算符:

方案一:拆分匹配,组合结果(简单直观)

先拿到整个字符串,再单独匹配所有数字和运算符,最后把它们组合起来:

const s = '1+22+33';
// 先存入完整字符串
const result = [s];
// 匹配所有数字或运算符(这里可以扩展运算符,比如+-*/)
const parts = s.match(/\d+|[+*/-]/g);
// 将拆分的部分追加到结果数组
result.push(...parts);

console.log(result); // 输出:["1+22+33", "1", "+", "22", "+", "33"]

方案二:用exec循环逐步捕获

如果想用exec循环的方式,可以调整正则,每次匹配一个数字加可选的运算符,然后依次收集结果:

const re = /(\d+)([+*/-])?/g;
const s = '1+22+33';
let m;
// 先存入完整字符串
const result = [s];

while ((m = re.exec(s)) !== null) {
  // 捕获到的数字
  if (m[1]) result.push(m[1]);
  // 捕获到的运算符(最后一个数字没有运算符,所以要判断)
  if (m[2]) result.push(m[2]);
}

console.log(result); // 输出:["1+22+33", "1", "+", "22", "+", "33"]

两种方案都能轻松扩展运算符类型,比如要支持减号、乘号、除号,只需要修改正则里的运算符部分即可(注意*和/在字符集里不需要转义,+和-同理)。

内容的提问来源于stack exchange,提问作者fwend

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:58:29