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.

Foi útil?

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.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top