
本文介绍使用正则表达式精准匹配带编号的句子(如“1. foo. 2. bar.”),并在每个编号前插入换行符,实现结构化排版,避免误拆标点导致的重复或错乱。
本文介绍使用正则表达式精准匹配带编号的句子(如“1. foo. 2. bar.”),并在每个编号前插入换行符,实现结构化排版,避免误拆标点导致的重复或错乱。
在处理 API 返回的连续编号文本(如 "1. foo. 2. bar. 3. baz.")时,简单地用 split('.') 或 replace('.', '\n') 会破坏语义——不仅句号被替换,连内容中的小数点、缩写(如 e.g.)或末尾标点都会被误切,导致重复、截断或格式错乱。
正确做法是锚定编号模式:识别形如 数字 + 英文句点 + 可选空白 的原子单元(例如 "1. "、"10. "),并在其前插入换行符,同时确保首项不额外换行。
推荐使用以下正则表达式方案:
const text = "1. foo. 2. bar. 3. baz."; const formatted = text.replace(/(?<!^)\s*(\d+\.\s+)/g, '\n$1').trim(); console.log(formatted); // 输出: // 1. foo. // 2. bar. // 3. baz.
✅ 关键解析:
立即学习“Java免费学习笔记(深入)”;
- (?
- \s*:匹配编号前可能存在的多余空格(如 "1. foo. 2. bar." 中的两个空格);
- (\d+\.\s+):捕获组,匹配一个或多个数字 + 字面量 . + 至少一个空白字符(含空格、制表符等);
- \n$1:用换行符 + 原始匹配内容(如 "2. ")替换,保留原始格式;
- .trim():清除可能因前置空格导致的首行缩进或末尾空白。
⚠️ 注意事项:
- 若原文末尾无句点(如 "1. foo 2. bar"),建议将正则中的 \. 改为 \.(保持严格)或适配为 \.\s* 以兼容无结尾标点场景;
- 若编号含括号(如 (1) foo (2) bar),需调整正则为 /(\(\d+\)\s+)/g;
- 在 HTML 环境中渲染时,需将换行符转为
或包裹在/<div style="white-space: pre-line"> 中才能生效; <li>对于更复杂结构(如嵌套编号、多级列表),建议结合 DOM 解析或专用 Markdown 库,而非纯字符串处理。</li> <p>该方法轻量、高效、无需外部依赖,适用于大多数 API 返回的线性编号文本清洗与展示场景。</p> </div>










