Как написать это регулярное выражение в Lua? - PullRequest
6 голосов
/ 31 мая 2011

Я новичок в функциях эквивалентности регулярных выражений Lua, мне нужно написать следующее регулярное выражение, которое должно соответствовать числам с десятичными числами

\b[0-9]*.\b[0-9]*(?!])

По сути, оно соответствует числам в десятичном формате (например: 1, 1.1, 0.1, 0.11), которые не заканчиваются на ']', я пытался написать такое регулярное выражение на Lua, используя string.gmatch, но я совершенно неопытен с соответствующими выражениями Lua ...

Спасибо!

Ответы [ 2 ]

6 голосов
/ 31 мая 2011

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

Вместо этого у Lua есть соответствующие шаблоны , которые гораздо менее эффективны (но все же достаточны для многих случаев использования):

  • Нет соответствия "границы слова",
  • без альтернатив,
  • , а также без предвидения или аналогичных.

Я думаю, что нет шаблона Lua, который бы соответствовал каждому возможному вхождению вашей строки, и нет другого, что означает, что вы каким-то образом должны обойти это.

Шаблон, предложенный Стюартом %d*%.?%d*, соответствует всем десятичным числам (с точкой или без нее), но также соответствует пустой строке, что не совсем полезно. %d+%.?%d* соответствует всем десятичным числам с по крайней мере одной цифрой перед точкой (или без точки), %d*%d.?%d+ соответствует всем десятичным числам по крайней мере с одной цифрой после точки (или без точки). %.%d+ соответствует десятичным числам без цифры перед точкой.

Простым решением будет поиск более чем одного из этих шаблонов (например, %d+%.?%d* и %.%d+) и объединение результатов. Затем посмотрите на места, где вы их нашли, и посмотрите, есть ли за ними «]».


Я немного поэкспериментировал с границей .

Шаблон %f[%.%d]%d*%.?%d*%f[^%.%d%]] соответствует всем десятичным числам, которым предшествует нечто, не являющееся ни цифрой, ни точкой (или ничем), а затем что-то, что не является ни ], ни цифрой, ни точкой (или ничем). Это также соответствует одной точке.

1 голос
/ 31 мая 2011

"%d*%.?%d+" будет соответствовать всем таким числам в десятичном формате (обратите внимание, что будут пропущены любые числа со знаком, такие как -1.1 или +3.14). Вам нужно будет найти другое решение, чтобы избежать экземпляров, заканчивающихся на ], таких как удаление их из строки перед поиском чисел:

local pattern = "%d*%.?%d+"
local clean = string.gsub(orig ,pattern .. "%]", "")
return string.gmatch(clean, pattern)
...