Lua中,当一个字符串过长时,如何智能地拆分?

我正在尝试编写一个函数,可以将超过特定长度的字符串分割成离字符串中点最近的空格。我已经基本实现了这个函数,但是它有两个问题。首先,它感觉比我所想要的要过于复杂。其次,它只能将字符串分割成两个部分,无法分割成三个或四个部分。我坚信我肯定漏掉了什么。

下面是该函数。s_original是源字符串,maxLineLength是允许的最大长度,该长度超过则触发拆分。

我将空格替换为“\n”换行符,因此我的最终产品是一个字符串,但是将字符串拆分成一个表也可以很好地工作。

function formatLineLength(s_original, maxLineLength)
    local length = #s_original
    if length > maxLineLength then
        --拆分字符串成2部分
        local midpoint = math.floor(length/2)
        local s_first = string.sub(s_original, 1, midpoint-1)
        local s_second = string.sub(s_original, midpoint)
        --在s_first中查找最后一个空格(%s)
        local s_first_space = string.find(string.reverse(s_first), "%s")
        --在s_second中查找第一个空格
        local s_second_space = string.find(s_second, "%s")

        if s_first_space == nil and s_second_space == nil then
            --如果两部分长度都为nil(没有空格)
            return s_first .. "\n" .. s_second
        elseif s_first_space ~= nil and s_second_space ~= nil then
            if s_first_space <= s_second_space then
                --如果空格在第一部分更接近
                local rev = string.reverse(s_first)
                return string.reverse(string.gsub(rev, "%s", "\n", 1)) .. s_second
            else
                --如果空格在第二部分更接近
                return s_first .. string.gsub(s_second, "%s", "\n", 1)
            end
        else
            if s_first_space == nil then
                --如果s_first中没有空格
                return string.gsub(s_original, "%s", "\n", 1)
            else
                --如果s_second中没有空格
                local rev = string.reverse(s_original)
                return string.reverse(string.gsub(rev, "%s", "\n", 1))
            end
        end
    else
        return s_original
    end
end

例如,如果我运行这行代码,我会得到以下结果:

formatLineLength("This is a long string example.", 20)
--返回:"This is a long\nstring example."

这正是我想要的,但这个函数实现起来太过混乱。

(修正了/n,谢谢)

点赞