JavaScript正则split连续字符问题(对比Java)
解决JavaScript中拆分连续相同字符的问题
一、修复原split正则的问题
JavaScript的split()方法如果使用包含捕获组的正则作为分隔符,会将捕获组匹配的内容插入到结果数组中,这就是你得到多余字符的原因。以下两种方案可以解决这个问题:
方案1:调整正则,避免捕获组混入结果
将捕获组移到正向预查内部,这样split()不会把捕获组内容加入结果数组,同时保留反向引用的逻辑:
'aaabbbccccdd'.split(/(?=(.)(?!\1))/g) // 返回 ["aaa", "bbb", "cccc", "dd"]
这个正则匹配的是「后面的字符与当前位置的下一个字符不同」的零宽位置,刚好对应连续相同字符组的末尾,拆分后不会引入多余内容。
方案2:用match()替代split()(更推荐)
直接匹配所有连续相同的字符组,逻辑更直观,代码更简洁:
'aaabbbccccdd'.match(/(.)\1*/g) // 返回 ["aaa", "bbb", "cccc", "dd"]
正则逻辑:匹配任意字符,再匹配任意数量(含0个)的相同字符,直接提取所有连续相同字符组。如果字符串为空,需处理null结果:
const str = 'aaabbbccccdd'; const result = str.match(/(.)\1*/g) || [];
二、非正则方法拆分连续相同字符
如果不想使用正则,可以通过遍历字符串实现:
function splitConsecutiveChars(str) { if (!str) return []; const result = []; let currentChar = str[0]; let currentGroup = currentChar; for (let i = 1; i < str.length; i++) { if (str[i] === currentChar) { currentGroup += str[i]; } else { result.push(currentGroup); currentChar = str[i]; currentGroup = currentChar; } } result.push(currentGroup); return result; } // 调用示例 splitConsecutiveChars('aaabbbccccdd'); // ["aaa", "bbb", "cccc", "dd"]
该方法通过逐个比较字符,将连续相同的字符合并为一组,最后收集所有组返回。
内容的提问来源于stack exchange,提问作者Luka
相关产品推荐
相关产品推荐

