吨和正则表达式

时间:2015-03-09 10:00:33

标签: regex lua numbers lua-patterns

给出一个(时间 - 值)字符串,如:

local dt = "12:34:56"

我想将此字符串剪切为

hh, mm, ss = "12", "34", "56"

因此我使用这样的正则表达式:

local hh = string.format("%02d", tonumber( dt:gsub(":..:..","") ))
local mm = string.format("%02d", tonumber( dt:gsub(":..:",""):gsub(":","") ))
local ss = string.format("%02d", tonumber( dt:gsub("..:..:","") ))

工作正常。 (时间字符串来自userinput,因此如果用户写入" 1"而不是" 01"),则填写0;

但是在值从0开始的情况下,它超出了luas tonumber()的范围(我猜是签名为零),与" 1"相同,tonumber()似乎无法处理值在" 2") 谁能告诉我如何处理这种情况?

除此之外,如果你能告诉我正则表达式中的不良做法,我会很高兴,如果有的话。

1 个答案:

答案 0 :(得分:5)

整个事情可以缩短到这一个班轮:

local hh, mm, ss = dt:match "(%d%d?):(%d%d?):(%d%d?)"

至于tonumber中发生的错误,是因为gsub在操作后返回2个值。首先是替代的sring,第二个是数字。 tonumber假设第二个参数是提供的基数(我认为这将是1)。由于基数1的数字只能是0;它引发了一个错误。