字符串元素字符数统计:空数组计数异常问题求助
字符串元素字符数统计:空数组计数异常问题求助
我现在遇到一个字符串字符数统计的问题,需要处理像 [Tom][] 这样的输入,期望得到 3, 0 的结果,但目前我的代码只能输出 3,没办法正确统计空数组对应的0。以下是我的代码:
const regex = /[\[\]]/gi; const a = str.replaceAll(regex, ' ').trim().split(" ") const arr = [] const arr2 = [] let newArr for(let i = 0; i < a.length; i++) { if (a[i].length === 0) { arr2.push(0) } if (a[i].length !== 0) { arr.push(a[i].length) } } newArr = arr.concat(arr2) if (newArr.includes(0)) { newArr.pop() } return newArr.join(", ")
问题出在哪里?我该怎么修改才能得到正确的结果呢?
回答:
嘿兄弟,看了你的代码和问题,马上就发现问题所在啦!
首先,你最后那段if (newArr.includes(0)) { newArr.pop() }是罪魁祸首——你辛辛苦苦把空元素对应的0收集起来,结果又把它删掉了,这可不就只得到3嘛😂
另外,你用split(" ")的方式也有点坑,比如处理[Tom][]的时候,替换后得到的是Tom (两个空格),trim后变成Tom ,split(" ")会得到["Tom", ""],这时候你把3放进arr,0放进arr2,concat后是[3,0],结果被pop一下就只剩3了。而且如果是[][]Tom这种情况,split后还会出现更多空字符串,逻辑会更乱。
给你推荐一个更靠谱的思路,直接用正则匹配每一对[]里的内容,这样不管是空的还是有内容的,都能精准捕获:
// 匹配所有[]包裹的内容,捕获组提取括号内的部分 const regex = /\[([^\]]*)\]/g; const result = []; let match; // 循环遍历所有匹配项 while ((match = regex.exec(str)) !== null) { // 捕获组1就是括号里的内容,直接取它的长度就行 result.push(match[1].length); } return result.join(", ");
测试一下你要的场景:
- 输入
[Tom][]→ 会匹配到[Tom](内容是Tom,长度3)和[](内容为空,长度0),输出就是3, 0,完全符合你的需求! - 输入单独的
[]→ 输出0 - 输入
[abc][def][]→ 输出3, 3, 0
如果非要用你原来的思路改,那至少要删掉那个pop的逻辑,并且把split改成split(/\s+/)来处理多个空格的情况,还要考虑原字符串全是空数组的情况:
const regex = /[\[\]]/gi; // 用正则分割任意数量的空格,避免产生多余空字符串 const a = str.replaceAll(regex, ' ').trim().split(/\s+/); const result = []; for (let item of a) { result.push(item.length); } // 处理原字符串是[]的情况,这时候trim后是空字符串,split后得到空数组 if (result.length === 0) { result.push(0); } return result.join(", ");
不过还是第一种方案更稳妥,毕竟直接匹配目标结构,不会因为空格的问题出岔子~
备注:内容来源于stack exchange,提问作者Derek
相关产品推荐
相关产品推荐

