2015-03-09 3 views
2

Учитывая это (время-значение) Строка, как:ToNumber и регулярное выражение

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, поэтому я заполняю ее 0, если пользователь пишет «1» вместо «01»)

Но в тех случаях, когда значение начинается с 0, оно выходит за пределы диапазона для luas tonumber() (Подписанный нуль, я думаю), то же самое с «1», tonumber(), похоже, не обрабатывает значения ниже «2») Может ли кто-нибудь сказать мне, как справиться с этой ситуацией?

Кроме того, я был бы счастлив, если бы вы могли показать мне плохую практику в моем регулярном выражении, если есть некоторые.

ответ

5

Все это может быть сокращен до этого один лайнера:

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

Как для встречающейся ошибки в вашем tonumber, это происходит потому, что gsub возвращает 2 значения после его работы. Сначала это замещенная строка, а вторая - число. tonumber предполагает, что вторым аргументом будет предоставленная база (которая будет 1, я думаю). Поскольку числа с базой 1 могут быть только 0; это вызывает ошибку.

Смежные вопросы