以符合现有代码期望的方式遍历可能为空的行。
2012-5-2 15:28:43
收藏:0
阅读:139
评论:1
我曾经用简单的方法迭代字符串中的行:
for line in s:gmatch("[^\r\n]+") do
这个方法非常完美!然后,现实生活发生了......
....现在我的需求已经改变了:我也需要匹配空行。这里就出现问题了:由于这种迭代形式用于多个不同的位置,而且每个位置都有其自身的复杂性,所以我希望尽可能避免更改周围的代码。我的 gmatch
/ find
尝试一直无法创建上述模式的“可替换”版本,因为这些函数有微妙的期望无法匹配。
我需要的语句( for line in some_matcher(s) do
)符合以下要求,我相信这些要求包括我所担心的所有边缘情况:
输入 期望
1. '' -- 匹配一次 ('')
2. '\r\n' -- 匹配两次 ('', '')
3. '\r\n\r\n' -- 匹配三次 ('', '', '')
4. 'aaa' -- 匹配一次 ('aaa')
5. 'aaa\r\n' -- 匹配两次 ('aaa', '')
6. 'aaa\r\nbbb' -- 匹配两次 ('aaa', 'bbb')
7. '\r\nbbb' -- 匹配两次 ('', 'bbb')
我的老方法假设只有 \r\n
行尾发生,如果新方法只处理该场景,那么完全没问题。
然而,由于我公司计划支持 Linux,如果答案还处理更直观的 \n
行尾(为了未来使用),那将非常感激,并且可以避免在几个月后重访此问题。但是,限制是在许多情况下,我需要该匹配项在原始字符串输入中的起始列。如果上述语句( for ... do
)可以作为附加功能输出,那会非常棒。
原文链接 https://stackoverflow.com/questions/10416869
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
如果你需要准确地检测换行符边界而不是跳过/丢弃它们,以跨平台的方式来说,你不能使用一个包括
\r
和\n
的集合,因为它会将换行符\r\n
匹配两次而不是一次(在DOS/Windows上,CRLF是一个单独的换行符)。你可以使用功能强大的正则表达式引擎(例如支持交替的引擎)来处理这个问题,但 Lua 的模式匹配库非常简单。你最好在处理文本之前归一化换行符,例如这样:
function normalize_eols(s) return s :gsub('\r\n','\n') :gsub('\r', '\n') end
至于输入=>输出表格,如果我们将换行符视为行_分隔符_,那么我希望
[^\n]*
(零个或多个非换行符字符)可以奏效,但是我们得到以下结果:'' => ('') '\n' => ('', '') '\n\n' => ('', '', '') 'aaa' => ('aaa', '') 'aaa\n' => ('aaa', '', '') 'aaa\nbbb' => ('aaa', '', 'bbb', '') '\nbbb' => ('', 'bbb', '')
坦白地说,我也不知道为什么。
然而,如果我们认为换行符是一行_终止符_,那么我们可以通过在输入后附加一个换行符,并使用模式
[^\n]*\n
(零个或多个非换行符字符后跟一个换行符)来获取所需的结果:'\n' => ('') '\n\n' => ('', '') '\n\n\n' => ('', '', '') 'aaa\n' => ('aaa') 'aaa\n\n' => ('aaa', '') 'aaa\nbbb\n' => ('aaa', 'bbb') '\nbbb\n' => ('', 'bbb')
因此,你的代码将变成这样:
s = normalize_eols(s) .. '\n' for line in s:gmatch('([^\n]*)\n') do ...