【发布时间】:2017-02-16 14:34:03
【问题描述】:
背景信息
我有一个 csv 文件,其中的行如下所示:
+11231231234,13:00:00,17:00:00,1111100,12345,test.net
+11231231234,,,0000000,23456,test.net
+11231231234,18:00:00,19:00:00,1111100,09991,test.net
我现在的lua模式是这样的:
local id, start_time, end_time, asd, int, domain = line:match("(%+%d+),([%d%d:]*),([%d%d:]*),(%d*),([%d%*%#]*),(%a*.*)")
它的工作原理
问题
如果存在 start_time / end_time 值,我将如何更改此模式,我只想提取前两组数字?例如,从这个输入:
+11231231234,18:00:00,19:00:00,1111100,09991,test.net
我想最终得到这些值:
start_time = 18:00
end_time = 19:00
而不是
start_time = 18:00:00
end_time = 19:00:00
我的尝试
我试过改变这个:
line:match("(%+%d+),([%d%d:]*),([%d%d:]*),(%d*),([%d%*%#]*),(%a*.*)")
对此:
line:match("(%+%d+),([%d%d:%d%d]*),([%d%d:%d%d]*),(%d*),([%d%*%#]*),(%a*.*)")
但是没办法
编辑 1
我把模式改成这样:
line:match("(%+%d+),(%d*:?%d*)[%d:]*,(%d*:?%d*)[%d:]*,(%d*),([%d%*#]*),(%S*)")
在某些情况下,它可以工作......但在以下情况下,它会失败:
+11231231234,00:00:00,00:00:00,1111100,12345,test.net
因此,当时间戳全面为零时,它不会正确修剪秒数。我目前正在审查代码以确保它不是我的错字。 谢谢。
【问题讨论】:
-
所以你只想要它们存在时的开始和结束,如果它们不存在则什么都不需要?
-
是的......如果它们确实存在,我需要从每个中截断/删除最后一组“:00”
-
使用
end作为变量名会导致脚本错误。即使您的解释器会接受end作为变量名,但我怀疑这是非常糟糕的做法。 -
@Piglet(嘻嘻,我喜欢你的手柄!)你说得对。我实际上在实际代码中使用了“start_time”和“end_time”......但为了简化我在这里的帖子,我删除了 _time 部分。但请放心,它只是在帖子中。对不起,噪音。我已经更新了问题以澄清
-
我的建议是不要尝试将所有内容都塞进一个 Lua 模式中。这些不是正则表达式,所以只需使用单独的模式来获得你想要的。
标签: lua pattern-matching lua-patterns