如何在Lua中将文本段落合并为单行并保留指定换行规则
实现方案
Lua的原生模式匹配没有零宽断言这类高级正则特性,写复杂的单行匹配规则很容易出现漏匹配、误匹配的情况,针对你的需求,逐行处理是最稳定且容易维护的方案,逻辑完全贴合你列出的三条规则:
local function merge_paragraphs(text) local lines = {} local current_paragraph = nil for line in text:gmatch("[^\n]*\n?") do local raw_line = line:gsub("\n$", "") -- 处理空行,保留连续换行 if raw_line == "" then if current_paragraph then table.insert(lines, current_paragraph) current_paragraph = nil end table.insert(lines, "") -- 处理标题行:行首(允许带空格)不以字母开头,保留原始换行 elseif not raw_line:match("^%s*%a") then if current_paragraph then table.insert(lines, current_paragraph) current_paragraph = nil end table.insert(lines, raw_line) -- 处理普通正文行,合并单个换行 else if current_paragraph then -- 调试用占位符,正式使用时替换为空格即可 current_paragraph = current_paragraph .. ">_<" .. raw_line else current_paragraph = raw_line end end end -- 处理末尾剩余的段落 if current_paragraph then table.insert(lines, current_paragraph) end return table.concat(lines, "\n") end
效果验证
将你提供的示例文本传入该函数,输出结果完全符合要求:
- 所有标题行(
*lrv-section-1*、1 -- Introduction~)的换行完全保留 - 段落之间的连续空行完整保留
- 段落内部的所有单个换行都会被替换为指定占位符,没有漏处理的情况
之前你尝试的两种模式都存在逻辑缺陷:第一种(\n%a.-)\n(%S)的惰性匹配每次只会匹配两行,指针跳转后剩余行不会被重复扫描,导致大量漏匹配;第二种(.)\n(%S)没有排除空行、标题行的边界条件,会破坏原有的格式结构。
如果后续需要对接自动换行工具,只需要把代码中的占位符替换为普通空格即可直接使用。
内容的提问来源于stack exchange,提问作者idbrii
相关产品推荐
相关产品推荐

