Логично 'или' в шаблонах Lua? - PullRequest
9 голосов
/ 12 августа 2010

Возможно ли достичь в Lua?

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\\", "[\\,/]$", "")

Хотя логические 'или' для шаблонов по-прежнему отсутствует.

Ответы [ 3 ]

8 голосов
/ 13 августа 2010

Lua не использует стандартные регулярные выражения для сопоставления с образцом. Цитата из книги Программирование на Lua объясняет причину:

В отличие от некоторых других языков сценариев, Lua не использует регулярные выражения POSIX (regexp) для сопоставления с образцом. Основной причиной этого является размер: типичная реализация регулярного выражения POSIX занимает более 4000 строк кода. Это больше, чем все стандартные библиотеки Lua вместе взятые. Для сравнения, реализация сопоставления с образцом в Lua имеет менее 500 строк. Конечно, сопоставление с образцом в Lua не может сделать все, что делает полная реализация POSIX. Тем не менее, сопоставление с образцом в Lua является мощным инструментом и включает некоторые функции, которые трудно сопоставить со стандартными реализациями POSIX.

Однако существует множество привязок к существующим библиотекам регулярных выражений, а также к расширенной библиотеке LPeg . Список их со ссылками см. В http://lua -users.org / wiki / LibrariesAndBindings , глава Text processing.

Также см. Этот вопрос: Сравнение шаблонов Lua с регулярными выражениями

5 голосов
/ 12 августа 2010

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
0 голосов
/ 12 августа 2010

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

Смотрите здесь: http://www.lua.org/manual/5.1/manual.html#5.4.1

(В проекте, над которым я работал, мы написали собственную привязку Lua к PCRE из-за этого.)

...