You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

效果验证

将你提供的示例文本传入该函数,输出结果完全符合要求:

  1. 所有标题行(*lrv-section-1*、1 -- Introduction~)的换行完全保留
  2. 段落之间的连续空行完整保留
  3. 段落内部的所有单个换行都会被替换为指定占位符,没有漏处理的情况

之前你尝试的两种模式都存在逻辑缺陷:第一种(\n%a.-)\n(%S)的惰性匹配每次只会匹配两行,指针跳转后剩余行不会被重复扫描,导致大量漏匹配;第二种(.)\n(%S)没有排除空行、标题行的边界条件,会破坏原有的格式结构。

如果后续需要对接自动换行工具,只需要把代码中的占位符替换为普通空格即可直接使用。


内容的提问来源于stack exchange,提问作者idbrii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:15:02