2010-08-11 10 views
8

¿Se puede lograr en Lua?Lógica 'o' en patrones 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" 

El punto aquí es la no aceptación de las declaraciones lógicas 'o' en los patrones de Lua.


EDIT: di cuenta de que es posible hacer esto:

strng.gsub("slash\\ending\\string\\", "[\\,/]$", "") 

Aunque lógico 'o' patrones se siguen desaparecidos.

Respuesta

6

Lua no utiliza expresiones regulares estándar para la coincidencia de patrones. Una cita del libro Programming in Lua explica la razón:

A diferencia de varios otros lenguajes de scripting, Lua no utiliza expresiones regulares POSIX (expresiones regulares) para la coincidencia de patrones. La razón principal de esto es el tamaño: una implementación típica de la expresión regular POSIX toma más de 4.000 líneas de código. Esto es más grande que todas las bibliotecas estándar Lua juntas. En comparación, la implementación de la coincidencia de patrones en Lua tiene menos de 500 líneas. Por supuesto, la coincidencia de patrones en Lua no puede hacer todo lo que hace una implementación completa de POSIX. Sin embargo, la coincidencia de patrones en Lua es una herramienta poderosa e incluye algunas características que son difíciles de combinar con las implementaciones estándar de POSIX.

Sin embargo, hay muchas conexiones a las bibliotecas de expresiones regulares existentes y también a la biblioteca avanzada LPeg. Para obtener una lista de ellos con enlaces, vea http://lua-users.org/wiki/LibrariesAndBindings, capítulo Text processing.

Además, vea esta pregunta: Lua pattern matching vs. regular expressions

0

Las expresiones regulares de Lua son ... anormales. Por lo que puedo decir de la documentación, no hay soporte para la alternancia general, ni para aplicar operadores de repetición a grupos. En tu caso, como dices, puedes obtener lo que quieres con una clase de personaje (aunque no estoy seguro de lo que está haciendo la coma en tu clase de personaje).

Ver aquí: http://www.lua.org/manual/5.1/manual.html#5.4.1

(En un proyecto en el que solía trabajar, escribimos nuestra propia Lua unión a PCRE debido a esto.)

3

Lua pattern matching no es lo mismo que las expresiones regulares, y no tiene un concepto de alternancia

Por ejemplo, si desea eliminar "abc" o "efg" desde el final de una cadena (similar a expresión regular) el siguiente código funcionaría así:

local inputstring="123efgabc" 
local s,n = inputstring:gsub("abc$", "") 
if n == 0 then 
    s,n = inputstring:gsub("efg$", "") 
end 
print(s) --> 123efg