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

如何使用模式忽略lua中输入字符串的某些部分?,lua,pattern-matching,lua-patterns,Lua,Pattern Matching,Lua Patterns,背景信息 我有一个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("(%+

背景信息

我有一个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*.*)")
及其工作原理

问题

我将如何更改此模式,以便在存在开始时间/结束时间值时,只提取前两组数字?例如,从这个输入:

+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*.*)")
 line:match("(%+%d+),(%d*:?%d*)[%d:]*,(%d*:?%d*)[%d:]*,(%d*),([%d%*#]*),(%S*)")
但这是不可能的

编辑1

我将模式更改为:

 line:match("(%+%d+),(%d*:?%d*)[%d:]*,(%d*:?%d*)[%d:]*,(%d*),([%d%*#]*),(%S*)")
在某些情况下,它的工作。。。但在以下情况下,它会失败:

  +11231231234,00:00:00,00:00:00,1111100,12345,test.net
因此,当时间戳整体为零时,它不会正确地调整秒数。我目前正在检查代码,以确保它不是我这边的打字错误。
谢谢

我建议为此使用两种Lua模式。因为不能在Lua模式中定义量化序列,所以没有办法做到这一点

因此,您可以使用

(%+%d+),(%d+:%d+):%d+,(%d+:%d+):%d+,(%d*),([%d#]*),(%a*.*)
要以hh:mm的形式获取
startime
endtime
,如果它们都存在,并且如果模式不匹配,请使用以前的模式


还请注意,括号表达式与单个字符(类)匹配,因此
[%d%d:][/code>与
[%d:][/code>匹配相同的字符-数字和
-与
[%d:][/code>

使用
作为分隔符,使用函数,例如:

function Explode(sInput)
  local x = {}
  for w in sInput:gmatch "(.-)," do
    table.insert(x, w)
  end
  return x
end
您将以表格的形式获得所有5个值。现在,只需检查索引
2
3
处的字符串是否为空,并根据您的要求进行解析:

-- Use unpack if not using lua 5.3
 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

所以你只想要开始和结束,如果它们存在,但没有什么,如果它们不存在?是的。。。如果它们确实存在,我需要截断/删除每个字符串的最后一组“:00”,因为变量名会导致脚本错误。即使您的解释器接受
end
作为变量名,我怀疑这是一种非常糟糕的做法。@pigge(嘻嘻,我喜欢您的句柄!)您完全正确。我实际上在实际代码中使用了“开始时间”和“结束时间”。。。但是为了简化我在这里的帖子,我删除了时间部分。但请放心,它只是在邮政。对不起,吵闹了。我更新了这个问题以澄清我的建议是不要试图将所有内容都塞进一个Lua模式。这些都不是正则表达式,所以只需使用不同的模式即可。Egor,请参阅我文章中的编辑1。谢谢。它可以正常工作:
。。。00:00:00…
。你的输出是什么?在没有指定时间的情况下我得到00:00:00:00…在其他情况下,当有一个小时。。。我以13:00 15:00为例。例如,你能在其他系统上重现错误的行为吗?