Lua字符串操作

我正在尝试找到一种方法,但目前还没有成功,将一个非常长的字符串添加一个新行("\n")。

有没有一个函数可以在每x个字符后插入一个新行?基本上,我需要在每95个字符后添加一个新行。以下是我正在使用的文本:

备忘录

主题:主题

1)Nam fabulas mnesarchum comprehensam ne,cu ullum euismod consulatu usu。Eam alii lobortis voluptatum id,denique eligendi pertinax quo ne。Vis congue eirmod ut。Duo probo soleat ex。Elit pertinax abhorreant eu his,ipsum dicam dissentiunt pri id。Kasd erant dolorum id sed,ei vim partem deseruisse,ne mea dico tantas alienum。

2)Has cu facilisis mediocritatem。Fabellas lucilius vim ex。Mei simul omnium et,wisi vidit ut ius。Ad has erat honestatis。Malis animal aliquid id usu。

3)Nulla utinam appellantur cu qui,scripta sententiae disputando eu nam,ut pri unum labore。Odio wisi torquatos sea cu。Ut detracto torquatos repudiandae pri。Vim puto solum epicurei at。Per nonummy perpetua similique te,odio platonem ut pri。Mei indoctum prodesset in,eam nisl quaerendum at。

4)At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident,similique sunt in culpa qui officia deserunt mollitia animi,id est laborum et dolorum fuga。Et harum quidem rerum facilis est et expedita distinctio。Nam libero tempore,cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus,omnis voluptas assumenda est,omnis dolor repellendus。

点赞
用户107090
用户107090

尝试使用print(s:gsub("("..string.rep(".",95)..")","%1\n"))

但是我怀疑你想对每一行进行操作,而不是处理整个文本。

2013-06-21 17:36:30
用户1208078
用户1208078

这个代码将直接输出长度小于 95 个字符的行,并将长度大于 95 个字符的行分割成 94 个字符的块并加上一个换行符。它不会在空格处分割,这留给你自己练习。

local fout = io.output(os.getenv('userprofile').. '\\desktop\\temp.txt', 'w+');
for str in string.gmatch(text, '(.-\n)') do
    if str:len() > 95 then
        while str:len() > 95 do
            local s = str:sub(1, 94)
            fout:write(s.. '\n')
            str = str:sub(94)
        end
    else
        fout:write(str)
    end
end
fout:flush(); fout:close();
2013-06-21 17:50:15
用户1847592
用户1847592

很简单!

local text = io.open'memorandum.txt':read'*a'  -- 从文件中加载文本
local n0, width = 0, 80
text = text:gsub('()(%s)',
    function(n, c)
        c = (n-n0 > width) and '\n' or c
        n0 = (c == '\n') and n or n0
        return c
    end)
io.open('memorandum2.txt','w'):write(text)  -- 将更正后的文本保存到文件中
2013-06-21 18:14:07
用户1993231
用户1993231

我解释问题为:我想将文本分成每行最多95个字符,尽可能接近该限制的行,并在空格上断开。

我忽略了其他答案中的文件 IO。下面是代码:

-- 第二个参数是控制换行的位置,如果没有指定,默认为80。
-- 如此调用:breakAt(longstring, 95)
local function breakAt(str, lineLength)
    local lineLength = lineLength or 80
    -- 对于大型文本操作来说,使用数组更有效率。
    local out = {}
    -- 匹配没有换行符的行,保存原始的换行符。
    for line, breaks in str:gmatch('([^\n]+)(\n+)') do
        local count = 0
        -- 使用 '*' 匹配空格,以允许行末的最后一个单词没有邻近的空格。
        for word, whitespace in line:gmatch('(%S+)(%s*)') do
            count = count + #word
            if count > lineLength then
                -- 如果这个单词跨越了 lineLength 的边界,将最后一个单词的空格用换行符替换。
                out[#out] = '\n'
                -- 当前单词将会成为新一行的第一个单词。
                count = #word
            end
            count = count + #whitespace
            table.insert(out, word)
            table.insert(out, whitespace)
        end
        table.insert(out, breaks)
    end
    return table.concat(out)
end

这将在空格上分割字符串,以实现最大化每行单词数量的效果。

2013-06-21 20:39:41