Lógico 'ou' em padrões de lua?
-
27-09-2019 - |
Pergunta
É possível alcançar em 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"
O ponto aqui é a aceitação de declarações lógicas 'ou' nos padrões Lua.
EDIT: Acabei de perceber que é possível fazendo isso:
strng.gsub("slash\\ending\\string\\", "[\\,/]$", "")
Embora ainda esteja faltando 'ou' lógicos 'ou' para padrões.
Solução
Lua não usa expressões regulares padrão para correspondência de padrões. Uma citação do livro Programação em Lua explica o motivo:
Ao contrário de várias outras linguagens de script, o Lua não usa expressões regulares POSIX (REGEXP) para correspondência de padrões. O principal motivo disso é o tamanho: uma implementação típica do POSIX Regexp leva mais de 4.000 linhas de código. Isso é maior do que todas as bibliotecas padrão da Lua juntas. Em comparação, a implementação da correspondência de padrões em Lua tem menos de 500 linhas. Obviamente, a correspondência de padrões em Lua não pode fazer tudo o que uma implementação completa do POSIX faz. No entanto, a correspondência de padrões em Lua é uma ferramenta poderosa e inclui alguns recursos difíceis de combinar com as implementações POSIX padrão.
No entanto, existem muitas ligações às bibliotecas de expressão regulares existentes e também ao avançado LPEG biblioteca. Para uma lista deles com links, consulte http://lua-users.org/wiki/librariesandbindings, capítulo Text processing
.
Além disso, veja esta pergunta: Lua Matching Pattern vs. Expressões regulares
Outras dicas
Lua correspondência de padrões não é o mesmo que expressões regulares e não possui um conceito de alternância.
Por exemplo, se você quiser remover "abc"
ou "efg"
do final de uma string (semelhante a "(abc|efg)$"
expressão regular) o seguinte código funcionaria bem:
local inputstring="123efgabc"
local s,n = inputstring:gsub("abc$", "")
if n == 0 then
s,n = inputstring:gsub("efg$", "")
end
print(s) --> 123efg
As expressões regulares da Lua são ... anormais. Tanto quanto posso dizer pela documentação, não há suporte para alternância geral, nem para a aplicação de operadores de repetição a grupos. No seu caso, como você diz, você pode obter o que deseja com uma classe de personagens (não tenho certeza do que a vírgula está fazendo na sua classe de personagens).
Veja aqui: http://www.lua.org/manual/5.1/manual.html#5.4.1
(Em um projeto em que trabalhava, escrevemos nossa própria ligação ao PCRE por causa disso.)