Lua регулярное выражение, чтобы найти цифру в строке - PullRequest
2 голосов
/ 20 июня 2019

Какое правильное регулярное выражение для поиска цифры в строке, в Lua?Из-за того, как круглые скобки используются в регулярных выражениях lua, кажется, что трудно правильно сопоставить десятичную точку и цифры после нее.

Обходной путь в тестовом коде ниже работает для непосредственных потребностей моего скрипта, но также принимает шаблоны типа +1.23.45.

--[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?  std regex for a numeral

s = "+1.23"
re = "([+-]?%d+[%.%d+]*)"
n = s:match (re)
print (n)

1 Ответ

1 голос
/ 21 июня 2019

Если вы настаиваете на свободном определении числового значения, такого как показано в регулярном выражении, у нас проблемы, так как шаблоны 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.

...