正则捕获重复模式问题:无法完整捕获多运算项字符串内容
解决正则捕获重复分组丢失前序匹配的问题
我懂你遇到的困扰了——用重复捕获组的时候,前面的匹配结果会被后面的覆盖,导致只能拿到最后一组数字和运算符,对吧?
先说说你当前正则的问题:/(?:(\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
相关产品推荐
相关产品推荐

