使用JavaScript正则表达式去除连续重复数字的问题排查
第一种正则写法的问题解析
核心问题:静态正则字面量无法动态匹配循环变量
第一种写法里的/ii/g是静态正则字面量,它的匹配规则是固定的——只会匹配字符串里连续的两个字母i,和循环中的变量i完全没关系。
循环里的i是遍历当前字符(比如3、5、8这些数字),但正则字面量不会把其中的i替换成循环变量的值,每次执行a.replace(/ii/g, i)时,都找不到任何匹配项,原字符串自然不会有变化,最后输出的还是处理前的123345567889。
第二种写法为什么能正常工作
第二种写法用new RegExp()构造了动态正则:每次循环都会把当前的i(比如数字3)拼进正则模板,生成匹配该数字连续重复的规则,比如当i=3时,正则等价于/(3)(3)/g,能精准找到字符串里的33,并替换成单个3。
更高效的优化方案
其实完全不需要循环,用一个正则就能一次性搞定所有连续重复数字:
let a = "1 2 3 3 4 5 5 6 7 8 8 9"; a = a.split(" ").join("").replace(/(\d)\1+/g, "$1"); console.log(a); // 输出:123456789
这里(\d)\1+的意思是:匹配一个数字(捕获到分组1),紧接着出现一次或多次和分组1相同的数字,然后替换成分组1的内容,也就是保留单个数字。
内容的提问来源于stack exchange,提问作者qusai ghalil
相关产品推荐
相关产品推荐

