【问题标题】:How to use patterns to ignore certain part of an input string in lua?如何使用模式忽略lua中输入字符串的某些部分?
【发布时间】: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


【解决方案1】:
local id, start_time, end_time, asd, int, domain = 
   line:match("(%+%d+),(%d*:?%d*)[%d:]*,(%d*:?%d*)[%d:]*,(%d*),([%d%*#]*),(%S*)")

【讨论】:

  • Egor,请参阅我帖子中的编辑 1。谢谢。
  • 它按预期工作:... 00:00 00:00 ...。你的输出是什么?
  • 我得到 00:00:00 00:00:00 在没有指定时间的情况下......然后在其他情况下,当有一个小时......我得到 13 :00 15:00 为例。
  • 您能否在其他系统上重现错误行为,例如here
【解决方案2】:

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

所以,你可以使用

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

如果startimeendtime 都存在,则以hh:mm 的形式获取它们,如果模式不匹配,请使用你以前的。

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

【讨论】:

    【解决方案3】:

    ,为分隔符分割字符串,使用函数,如:

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

    您将以表格的形式获得所有 5 个值。现在,只需检查索引23 处的字符串是否不为空,并根据您的要求对其进行解析:

    -- 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      相关资源
      最近更新 更多