Логическое " или " в шаблонах Lua?
возможно ли достичь в Lua?
local noSlashEnding = string.gsub("slashendingstring", "|/$", "")
-- noSlashEnding should contain "slashendingstring"
local noSlashEnding2 = string.gsub("slash/ending/string/", "|/$", "")
-- noSlashEnding2 should contain "slash/ending/string"
дело здесь не в принятии логических утверждений " или " в шаблонах Lua.
РЕДАКТИРОВАТЬ:
Просто понял, что это возможно, сделав это:
strng.gsub("slashendingstring", "[,/]$", "")
хотя логическое " или " для шаблонов все еще отсутствует.
3 ответов
Lua не использует стандартные регулярные выражения для сопоставления шаблонов. Цитата из книги программирование в Lua объясняет причину:
В отличие от нескольких других языков сценариев, Lua не использует регулярные выражения POSIX (regexp) для сопоставления шаблонов. Основная причина этого-размер: типичная реализация POSIX regexp занимает более 4000 строк кода. Это больше, чем все стандартные библиотеки Lua вместе. В сравнении, реализация сопоставления шаблонов в Lua имеет менее 500 строк. Конечно, сопоставление шаблонов в Lua не может сделать все, что делает полная реализация POSIX. Тем не менее, сопоставление шаблонов в Lua является мощным инструментом и включает в себя некоторые функции, которые трудно сопоставить со стандартными реализациями POSIX.
однако существует много привязок к существующим библиотекам регулярных выражений, а также advanced LPeg библиотека. Список их со ссылками см. В разделе 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 из-за этого.)