JavaScript如何将字符串按指定分隔符分割且保留分隔符到数组中
实现自定义分割函数
该函数和JS原生split方法的核心差异是会保留分隔符作为结果数组的独立元素,完全匹配你给出的用例要求。
完整实现代码
function mySplitFunction(str, sep) { // 转义分隔符中的正则特殊字符,避免匹配异常 const escapeRegExp = (string) => string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // 边界处理:分隔符为空时直接返回原字符串组成的数组 if (sep === '') return [str]; const separatorReg = new RegExp(`(${escapeRegExp(sep)})`, 'g'); const result = []; let lastMatchEnd = 0; let matchResult; // 遍历所有匹配到的分隔符 while ((matchResult = separatorReg.exec(str)) !== null) { // 把两个分隔符中间的非分隔符内容加入结果 if (matchResult.index > lastMatchEnd) { result.push(str.slice(lastMatchEnd, matchResult.index)); } // 把匹配到的分隔符作为独立项加入结果 result.push(matchResult[0]); lastMatchEnd = separatorReg.lastIndex; } // 把最后一段分隔符之后的剩余内容加入结果 if (lastMatchEnd < str.length) { result.push(str.slice(lastMatchEnd)); } return result; }
用例测试
const str1 = 'aabbcc'; const str2 = 'aabbccaaddaaaaeeff'; console.log(mySplitFunction(str1, 'aa')); // 返回 ['aa','bbcc'] console.log(mySplitFunction(str1, 'bb')); // 返回 ['aa','bb', 'cc'] console.log(mySplitFunction(str2, 'aa')); // 返回 ['aa','bbcc', 'aa','dd', 'aa','aa', 'eeff'] console.log(mySplitFunction(str2, 'dd')); // 返回 ['aabbccaa','dd', 'aaaaeeff']
实现逻辑说明
- 先对传入的分隔符做正则特殊字符转义,避免
.、*、+这类正则关键字导致匹配逻辑错误 - 构造带分组的全局正则匹配所有分隔符位置
- 遍历匹配结果,依次将匹配间隔的非分隔符内容、匹配到的分隔符插入结果数组
- 遍历结束后补全最后一段剩余的非分隔符内容
内容的提问来源于stack exchange,提问作者Loudrous
相关产品推荐
相关产品推荐

