Pregunta

¿Es posible lograr en 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 los estados lógicos 'o' en los patrones de Lua.


EDITAR: Acabo de dar cuenta de que es posible al hacer esto:

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

A pesar de lógica 'o' para los patrones que todavía falta.

¿Fue útil?

Solución

Lua no utiliza expresiones regulares estándar para la coincidencia de patrones. Una cita del libro programación en 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 aplicación típica de expresión regular POSIX lleva más de 4.000 líneas de código. Esto es más grande que todas las bibliotecas estándar de Lua juntos. En comparación, la implementación de coincidencia de patrones en Lua tiene menos de 500 líneas. Por supuesto, la coincidencia de patrones en Lua no puede hacer todo que la aplicación plena 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 POSIX.

Sin embargo, hay muchos enlaces con las bibliotecas de expresiones regulares existentes y también la avanzada biblioteca LPEG . Para obtener una lista de ellos con vínculos, consulte http://lua-users.org/wiki/LibrariesAndBindings, capítulo Text processing.

Además, ver a esta pregunta: Lua coincidencia de patrones frente a las expresiones regulares

Otros consejos

Lua coincidencia de patrones no es lo mismo que las expresiones regulares, y no tiene una alternancia concepto.

Por ejemplo, si desea quitar "abc" o "efg" desde el final de una cadena (similar a "(abc|efg)$" 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

Lua expresiones regulares son ... anormal. Por lo que yo puedo decir por la documentación, no hay soporte para la alternancia en general, ni para la aplicación de operadores de repetición de grupos. En su caso, como dice usted, usted puede conseguir lo que quiera con una clase de caracteres (no estoy seguro de lo que la coma está haciendo en su clase de caracteres, sin embargo).

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top