split() 可通过正则捕获组、断言和分支实现“带线索分割”:捕获组保留分隔符并交替出现在结果中;断言实现切而不吞;分支支持多模式匹配;再用 reduce 等重组结构化数据。

想让 split() 不只是“切开”,而是“带着线索切”?关键不在分隔符本身,而在怎么写正则——捕获组、断言、分支组合,三者配合,一次分割就能带出结构、类型和上下文。
用捕获组把分隔符“捞出来”
默认 split 会吃掉分隔符,但只要正则里加一对括号,它就原样出现在结果里,和内容交替排列:
-
"a,b;c".split(/([,;])/)→["a", ",", "b", ";", "c"] - 索引为偶数的是内容(
"a"、"b"、"c"),奇数的是分隔符(","、";") - 多字符分隔符也一样:
"x and y or z".split(/(and|or)/)→["x ", "and", " y ", "or", " z"]
用断言“切而不吞”,精准定位切点
当你要在某个模式前/后切开,又不想移除它,就用 (?=[pattern])(先行)或 (?(后行):
- 驼峰命名切分:
"userFirstName".split(/(?=[A-Z])/)→["user", "FirstName"] - 数字后接字母处切开:
"item123name".split(/(? → <code>["item123", "name"] - 时间戳前切分:
"[INFO] 2024-03-15 10:00".split(/(?=\d{4}-\d{2}-\d{2})/)
用分支组合表达“多意图”切分
一个正则里塞多个捕获组,就能一次提取多种边界信息:
- 解析日志:
log.split(/(\[[^\]]+\])|(\s+(?=\w+=))|(\s+(?=\d{4}-\d{2}-\d{2}))/) - 结果中同时出现:模块标记(如
"[INFO]")、字段起始空格(" ")、时间戳前空格 - 后续可按元素类型归类,还原出层级结构,不用多次 split
处理空项:别让结构塌陷
首尾匹配、连续分隔符都会产生 "",但直接 .filter(Boolean) 可能误删合法空值:
- 只去首尾:
result.filter((_, i) => i > 0 && i - 跳过中间连续空项:
result.filter((s, i) => s || !/^\s*$/.test(result[i-1]) || !/^\s*$/.test(result[i+1])) - 若需“内容-分隔符”成对,可用
reduce重组,比如每两项合并为对象











