首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >遍历包括空行在内的行。

遍历包括空行在内的行。
EN

Stack Overflow用户
提问于 2013-10-11 20:05:09
回答 5查看 9.9K关注 0票数 8

给定一个包含一些空行的多行字符串,我如何迭代Lua中的行(包括空行)?

代码语言:javascript
运行
复制
local s = "foo\nbar\n\njim"
for line in magiclines(s) do
  print( line=="" and "(blank)" or line)
end
--> foo
--> bar
--> (blank)
--> jim

此代码不包括空行:

代码语言:javascript
运行
复制
for line in string.gmatch(s,'[^\r\n]+') do print(line) end
--> foo
--> bar
--> jim

此代码包含额外的虚假空白行:

代码语言:javascript
运行
复制
for line in string.gmatch(s,"[^\r\n]*") do
  print( line=="" and "(blank)" or line)
end
--> foo
--> (blank)
--> bar
--> (blank)
--> (blank)
--> jim
--> (blank)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-10-12 01:40:41

试试这个:

代码语言:javascript
运行
复制
function magiclines(s)
        if s:sub(-1)~="\n" then s=s.."\n" end
        return s:gmatch("(.-)\n")
end
票数 10
EN

Stack Overflow用户

发布于 2013-10-12 12:13:26

下面是一种利用LPEG的解决方案:

代码语言:javascript
运行
复制
local lpeg      = require "lpeg"
local lpegmatch = lpeg.match
local P, C      = lpeg.P, lpeg.C

local iterlines
do
  local eol  = P"\r\n" + P"\n\r" + P"\n" + P"\r"
  local line = (1 - eol)^0
  iterlines = function (str, f)
    local lines = ((line / f) * eol)^0 * (line / f)
    return lpegmatch (lines, str)
  end
end

您得到的是一个可以用来代替迭代器的函数。它的第一个参数是要迭代的字符串,第二个参数是每个匹配的操作:

代码语言:javascript
运行
复制
--- print each line
iterlines ("foo\nbar\n\njim\n\r\r\nbaz\rfoo\n\nbuzz\n\n\n\n", print)

--- count lines while printf
local n = 0
iterlines ("foo\nbar\nbaz", function (line)
  n = n + 1
  io.write (string.format ("[%2d][%s]\n", n, line))
end)
票数 4
EN

Stack Overflow用户

发布于 2013-10-12 12:30:44

这是另一种lPeg解决方案,因为我似乎是在与phg同时编写它。但既然语法更漂亮,我还是会给你的!

代码语言:javascript
运行
复制
local lpeg = require "lpeg"
local C, V, P = lpeg.C, lpeg.V, lpeg.P

local g = P({ "S",
    S = (C(V("C")^0) * V("N"))^0 * C(V("C")^0),
    C = 1 - V("N"),
    N = P("\r\n") + "\n\r" + "\n" + "\r",
})

像这样使用它:

代码语言:javascript
运行
复制
local test = "Foo\n\nBar\rfoo\r\n\n\n\rbar"
for k,v in pairs({g:match(test)}) do
    print(">", v);
end

当然也不只是print(g:match(test))

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19326368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档