split()中含捕获组时会保留分隔符:数组偶数索引为分割片段,奇数索引为捕获的分隔符;如"a,b;c".split(/([,;])/)得["a", ",", "b", ";", "c"]。

使用 String.prototype.split() 时,若正则表达式中包含**捕获组(即用括号包裹的子表达式)**,split 方法会将匹配到的分隔符本身也保留在返回的数组中。
捕获组让分隔符“现身”
默认情况下,split 会丢弃分隔符。但只要正则里有 (),哪怕只是想捕获整个分隔符,结果数组就会交替出现“内容”和“分隔符”:
- 匹配成功的捕获组内容会被插入到分割结果中
- 数组索引为偶数的位置通常是被分割的片段
- 索引为奇数的位置对应各次匹配的捕获结果(即分隔符)
基础写法示例
比如按逗号或分号切分,并保留它们:
const str = "a,b;c"; str.split(/([,;])/); // → ["a", ",", "b", ";", "c"]
注意:正则 /([,;]) 中的括号是关键。去掉就变成 /[,;]/,结果就是 ["a","b","c"],分隔符消失。
处理多个字符或复杂分隔符
捕获组同样适用于多字符分隔符,例如按 "and" 或 "or" 分割并保留:
const str = "apple and banana or cherry"; str.split(/(and|or)/); // → ["apple ", "and", " banana ", "or", " cherry"]
这里 (and|or) 是一个捕获组,匹配任一关键词,并把匹配到的词原样塞进结果数组。
注意事项与边界情况
- 如果字符串开头就匹配分隔符,结果数组首项为空字符串:
"x-y".split(/([\-])/)→["", "-", "y"] - 连续分隔符会产生空字符串片段:
"a,,b".split(/(,)/)→["a", ",", "", ",", "b"] - 不支持嵌套捕获组的“层级保留”,只保留最外层捕获组的匹配内容










