如何使用正则表达式将编号列表字符串按序号换行分割

如何使用正则表达式将编号列表字符串按序号换行分割

本文介绍如何用 JavaScript 正则表达式精准地将形如 “1. foo. 2. bar. 3. baz.” 的连续编号文本,按数字序号(如 1.、2.)为分界点插入换行符,生成格式清晰的多行列表,避免误拆非序号的句点。

本文介绍如何用 javascript 正则表达式精准地将形如 `”1. foo. 2. bar. 3. baz.”` 的连续编号文本,按数字序号(如 `1.`、`2.`)为分界点插入换行符,生成格式清晰的多行列表,避免误拆非序号的句点。

在处理 API 返回的结构化文本时,常会遇到“伪列表”——即逻辑上是编号条目,但物理上连成一行(如 “1. 初始化完成. 2. 连接数据库. 3. 启动服务.”)。若简单用 .split(‘.’) 或 .replace(/./g, ‘n’),会错误切割句子内部的句点(如 “完成.” → “完成n”),导致内容错乱和重复。

正确思路是:只在编号模式(如 1.、10.、123.)前插入换行符,且确保该编号不位于字符串开头(避免首行前多出空行)

推荐使用以下正则替换方案:

const text = "1. foo. 2. bar. 3. baz."; const formatted = text.replace(/(?<!^)s*(d+.s+)/g, 'n$1'); console.log(formatted); // 输出: // 1. foo. // 2. bar. // 3. baz.

关键解析

  • (?
  • s*:匹配编号前可能存在的任意空白(空格、制表符等),予以清除;
  • (d+.s+):捕获组,匹配一个或多个数字 + 字面量 . + 至少一个空白字符(如 “1. “);
  • ‘n$1’:用换行符 + 原始捕获内容替换,保留编号格式与后续空格。

⚠️ 注意事项

  • 若原文末尾无空格(如 “1. foo.2. bar.”),需调整正则以兼容紧邻情况,可改用 (d+.s*) 并在 $1 后手动补空格(如 ‘n$1 ‘);
  • 如需兼容中文标点(如 “1、foo。2、bar。”),需扩展正则中的标点部分(例如 [.、]);
  • 对于更复杂场景(含嵌套句点、小数如 1.5.),建议先预处理或改用 match() 提取再拼接,避免歧义。

总结:基于语义的正则替换(而非盲目按字符分割)是处理此类问题的核心。掌握 (?