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

字符串元素字符数统计:空数组计数异常问题求助

字符串元素字符数统计:空数组计数异常问题求助

我现在遇到一个字符串字符数统计的问题,需要处理像 [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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 08:39:31