如何在Lua中使用模式忽略输入字符串的某些部分?

背景信息

我有一个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:%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

所以当时间戳在整个板块中都为零时,它不能正确地修剪秒。我目前正在审查代码,以确保这不是我的错误。 谢谢。

点赞
用户3832970
用户3832970

我建议使用两个 Lua 模式来实现。因为 Lua 模式无法定义数量化的序列,所以无法通过其他方法进行实现。

因此,你可以使用以下模式:

(%+%d+),(%d+:%d+):%d+,(%d+:%d+):%d+,(%d*),([%d#]*),(%a*.*)

来获取如果 startimeendtime 都存在的话,它们将以 _hh:mm_ 的形式出现。但如果模式无法匹配,则使用之前的模式。

此外,请注意,括号表达式匹配单个字符(类),因此 [%d%d:][%d:] 相同,都可以匹配数字和冒号。

2016-10-07 17:17:17
用户1190388
用户1190388

使用 , 作为分隔符来拆分字符串,可以使用以下函数:

function Explode(sInput)
  local x = {}
  for w in sInput:gmatch "(.-)," do
    table.insert(x, w)
  end
  return x
end

你会得到一个包含 5 个值的表格。现在,只需检查索引为 23 的字符串是否为空,并根据要求解析它们:

-- 如果不使用 lua 5.3,请使用 unpack
 local id, start_time, end_time, asd, int, domain = table.unpack( Explode(line) )
if start_time:len() > 1 then
  start_time = start_time:match "(%d+:%d+)"
end
if end_time:len() > 1 then
  end_time = end_time:match "(%d+:%d+)"
end
2016-10-07 17:39:37
用户1847592
用户1847592

``` local id, start_time, end_time, asd, int, domain = line:match("(%+%d+),(%d*:?%d*)[%d:]*,(%d*:?%d*)[%d:]*,(%d*),([%d%*#]*),(%S*)")

使用正则表达式从line中提取出idstart_timeend_timeasdintdomain,并将其赋值给对应的变量。

2016-10-07 18:36:44