求助:不使用正则表达式提取字符串数字数组并保留单个0
修正方案:提取数字数组(保留单个0且不使用正则)
原代码的核心问题是:将连续数字字符拼接后直接用parseInt转换,导致全0的连续序列(如"00""000")被压缩成单个0,无法满足保留所有单个0的需求;而对于包含非0的多位数(如"67""700"),则需要保持为单个数字元素。
修正后的代码
function extractNumbers(string) { const arrNumbs = []; let currentDigits = ""; for (let i = 0; i < string.length; i++) { const elem = string.charAt(i); if (!isNaN(elem)) { currentDigits += elem; } else { if (currentDigits) { processDigitSequence(currentDigits, arrNumbs); currentDigits = ""; } } } // 处理字符串末尾的数字序列 if (currentDigits) { processDigitSequence(currentDigits, arrNumbs); } return arrNumbs; } // 处理单个数字序列的辅助函数 function processDigitSequence(digits, resultArr) { let isAllZero = true; // 判断当前序列是否全为0 for (const char of digits) { if (char !== '0') { isAllZero = false; break; } } if (isAllZero) { // 全0序列:每个0单独加入数组 for (let i = 0; i < digits.length; i++) { resultArr.push(0); } } else { // 含非0的序列:转成整数加入数组 resultArr.push(parseInt(digits, 10)); } } // 测试示例 const testStr = "00ghj67 h4 h000ytff700jhjk80"; console.log(extractNumbers(testStr)); // 输出: [0, 0, 67, 4, 0, 0, 0, 700, 80]
逻辑说明
- 遍历收集数字序列:遍历字符串时,持续将连续的数字字符存入
currentDigits变量,遇到非数字字符时触发序列处理。 - 分情况处理序列:
- 若序列全为0:根据序列长度,向结果数组中添加对应数量的单个0。
- 若序列包含非0数字:将整个序列转换为整数后添加到结果数组。
- 收尾处理:遍历结束后,处理字符串末尾可能剩余的未被触发处理的数字序列。
内容的提问来源于stack exchange,提问作者Nata77
相关产品推荐
相关产品推荐

