Логично 'или' в образцах луа?
-
27-09-2019 - |
Вопрос
Можно ли достичь в Луа?
local noSlashEnding = string.gsub("slash\\ending\\string\\", "\\|/$", "")
-- noSlashEnding should contain "slash\\ending\\string"
local noSlashEnding2 = string.gsub("slash/ending/string/", "\\|/$", "")
-- noSlashEnding2 should contain "slash/ending/string"
Точка здесь - это не принятие логических или «или» заявлений в образцах LUA.
Редактировать: только что понял, что возможно, делая это:
strng.gsub("slash\\ending\\string\\", "[\\,/]$", "")
Хотя логические «или» для шаблонов все еще отсутствуют.
Решение
Lua не использует стандартные регулярные выражения для сопоставления с рисунком. Цитата из книги Программирование в Луа объясняет причину:
В отличие от нескольких других языков сценариев, LUA не использует регулярные выражения POSIX (REGEXP) для сопоставления шаблона. Основная причина этого - это размер: типичная реализация POSIX Regexp занимает более 4000 строк кода. Это больше, чем все стандартные библиотеки LUA вместе. Для сравнения, реализация сопоставления сроков в LUA имеет менее 500 строк. Конечно, сопоставление картины в LUA не может сделать все, что делает полную реализацию POSIX. Тем не менее, сопоставление шаблона в LUA является мощным инструментом и включает в себя некоторые функции, которые трудно сопоставить со стандартными реализациями POSIX.
Тем не менее, есть много привязки к существующим библиотекам регулярных выражений, а также продвинутыми Lepeg библиотека. Для списка их со ссылками см. http://lua-users.org/wiki/librariesandbindings., глава Text processing
.
Также см. Этот вопрос: LUA образец сопоставления против регулярных выражений
Другие советы
Луа сопоставление картины не совпадает с регулярными выражениями, и не имеет концепции чередования.
Например, если вы хотели удалить "abc"
или "efg"
с конца строки (похоже на "(abc|efg)$"
Регулярное выражение) Следующий код будет работать хорошо:
local inputstring="123efgabc"
local s,n = inputstring:gsub("abc$", "")
if n == 0 then
s,n = inputstring:gsub("efg$", "")
end
print(s) --> 123efg
Lua регулярные выражения ... ненормально. Насколько я могу сказать из документации, нет поддержки общего чередования, ни для применения операторов повторения к группам. В вашем случае, как вы говорите, вы можете получить то, что вы хотите с классом персонажа (я не уверен, что запятая делает в своем классе персонажа).
Посмотреть здесь: http://www.lua.org/manual/5.1/manual.html#5.4.1
(В проекте я работал для работы, мы написали наши собственные обязательства LUA для PCRE из-за этого.)