
本文介绍如何用 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() 提取再拼接,避免歧义。
总结:基于语义的正则替换(而非盲目按字符分割)是处理此类问题的核心。掌握 (?










