给定的是一个(时间值)字符串,例如:

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”以下的值)
谁能告诉我如何处理这种情况?

除此之外,如果您能告诉我正则表达式中的错误做法(如果有的话),我将非常高兴。

最佳答案

整个过程可以简化为这一行:

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


至于tonumber中发生的错误,是因为gsub在其操作后返回2个值。第一个是替换的小数,第二个是数字。 tonumber假定第二个参数是提供的基数(我认为应该为1)。由于以1为底的数字只能是0;会引发错误。

关于regex - tonumber和正则表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28939226/

10-09 06:05