
本文介绍使用 Node.js 的 fs 模块和正则表达式,精准定位含 (C) 的独立行,将其移至前一行末尾并删除原行,适用于自动化处理生成的 TXT 文件。
本文介绍使用 node.js 的 `fs` 模块和正则表达式,精准定位含 `(c)` 的独立行,将其移至前一行末尾并删除原行,适用于自动化处理生成的 txt 文件。
在实际文本处理场景中(如日志标记、模板生成或文档注释自动化),常需将特定标记(如 (C))从独立行“上提”至其逻辑父行末尾。但原始方案中使用的正则 /\r?\n?.*\(C\).*$/gm 存在明显缺陷:它会错误匹配行内含 (C) 的内容(如 Wor(C)d1),并将整行替换为 " (C)",导致数据丢失或格式错乱——这与“仅处理独立 (C) 行”的需求不符。
✅ 正确思路应为:
- 识别真正独立的 (C) 行(即整行仅含可选空白符 + (C) + 可选空白符);
- 将其合并到前一行末尾(添加空格后接 (C));
- 删除该行本身及可能产生的空行。
以下是健壮、可复用的实现:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
const fs = require('fs');
function mergeCLine(filePath) {
const content = fs.readFileSync(filePath, 'utf8');
// 匹配:行首可选空白 + (C) + 行尾可选空白,且前后均有换行(或开头/结尾)
// 使用捕获组保留前一行,并安全替换
const result = content
.replace(/(^|\n)([^\n]+?)\s*\n\s*\(C\)\s*(?=\n|$)/g, '$1$2 (C)')
.replace(/\n\s*\(C\)\s*$/g, ' (C)'); // 处理文件末尾的 (C)
fs.writeFileSync(filePath, result);
return result;
}
// 示例调用
console.log(mergeCLine('./myFile.txt'));
? 关键说明:
- 正则 /^(\n|^)([^\n]+?)\s*\n\s*\(C\)\s*(?=\n|$)/gm 通过 ([^\n]+?) 精确捕获前一行非空内容,避免误删;
- (?=\n|$) 是正向先行断言,确保 (C) 后是换行或文件结尾,防止跨行误匹配;
- 两次 replace 覆盖所有位置(中间行 & 文件末尾),兼顾边界情况;
- 使用 fs.readFileSync + writeFileSync 保证同步执行,适合脚本化集成到文件生成流程中。
⚠️ 注意事项:
- 该方案默认处理 Unix (\n) 和 Windows (\r\n) 换行符;若需严格兼容 \r\n,可将 \n 替换为 (\r\n|\n);
- 若文本中存在多处 (C) 且需逐个向上合并(如嵌套结构),需改用逐行解析的数组遍历方式;
- 生产环境建议增加异常捕获(如 try/catch)及输入校验(如文件是否存在、编码是否为 UTF-8)。
此方法简洁、可靠,可无缝嵌入构建脚本或后端服务,在每次生成 TXT 文件后自动完成语义化格式修正。










