JavaScript中for循环内使用.match分割字符串失效问题排查
为什么循环内的字符串分割代码会返回null?
这个问题的核心其实是正则字面量无法直接解析变量——你循环里写的/.{1,i}/g并没有把循环变量i的数值代入进去,而是把i当成了正则表达式里的普通字符!
具体原因:
当你使用正则字面量(/.../语法)时,JS会在代码编译阶段就把正则内容固定下来,不会在运行时识别里面的变量。所以循环里的正则实际变成了匹配「任意1到字符'i'个长度的内容」,但量词部分必须是数字,这个语法是无效的,导致match方法找不到任何匹配项,自然就返回null了。
而你手动逐个push的代码里,正则是直接写死数字的(比如/.{1,2}/g),这是合法的正则语法,所以能正确分割字符串,得到预期结果。
解决方法:
要动态生成带变量的正则,得用RegExp构造函数,把变量作为参数传入,这样就能在运行时正确解析变量的值了。修改后的代码如下:
function solve(s){ var n = []; for (var i = 1; i <= s.length; i++) { // 用RegExp构造函数动态创建正则,把i的值代入量词部分 n.push(s.match(new RegExp(`.{1,${i}}`, 'g'))); } return n; };
现在调用solve("1341"),就能得到你想要的[["1", "3", "4", "1"], ["13", "41"], ["134", "1"], ["1341"]]啦。
内容的提问来源于stack exchange,提问作者Kat
相关产品推荐
相关产品推荐

