Если вы настаиваете на свободном определении числового значения, такого как показано в регулярном выражении, у нас проблемы, так как шаблоны lua не поддерживают операцию чередования |
.
Предлагаемый шаблон ([+-]?%d*%.?%d+)
фактически работает для большинства случаев, однако, если вы также захотите разрешить такие случаи, как 42.
(как PCRE), он потерпит неудачу.
Мы могли бы попробоватьиспользовать круглые скобки и необязательную дополнительную точку, которая будет выпадать в случае, подобном этому: ([+-]?%d*%.?%d+)%.?
Это близко, но удаляет последнюю точку, если за ней не следует цифра, и поэтому возвращает ложные срабатывания, такие как .12.
как .12
.*
* (Хотя, фактически, это то же самое, что ваш RE \[+-\]?(\d+(\.\d+)?|\.\d+)
без экспоненциальной части ..
В случае, если я бы предпочел более полный RE как this : ^[+-]?((\d+(\.\d*)?)|(\.\d+))$
)
Демонстрационный код:
re = "^([+-]?%d*%.?%d+)%.?$"
v = {'123', '23.45', '.45', '-123', '-273.15', '-.45', '+516', '+9.8', '+.5', -- regular matches
'34.', '+2.', '-42.', --only matched by prolematic last optional dot
'.', '-.', '+.', ' ', '', --expected no matches
'.12.', '+.3.', '-.1.', --false positives (strictly speaking)
'+1.23.45' -- no matches
}
for i, v in ipairs(v) do
n = v:match (re)
print (n)
end
Я думаю, что первый предложенный вариант приемлем.Если даже вторая версия все еще не обрезает его, я бы предложил попробовать lrexlib , библиотеку регулярных выражений с несколькими ароматами или LPeg , мощную библиотеку для разбора текста для Lua.