regex - Paréntesis del patrón Lua y 0 o 1 ocurrencia
lua string gsub (2)
Intento hacer coincidir una cuerda con un patrón, pero hay una cosa que no he podido descifrar. En una expresión regular haría esto:
Strings:
en
eng
engl
engli
englis
english
Pattern:
^en(g(l(i(s(h?)?)?)?)?)?$
Quiero que todas las cadenas sean un partido. En la coincidencia de patrones Lua no puedo hacer que esto funcione.
Incluso un ejemplo más simple como este no funcionará:
Strings:
fly
flying
Pattern:
^fly(ing)?$
¿Alguien sabe cómo hacer esto?
¿No puedes hacer que los grupos de partidos sean opcionales (o repetirlos) usando los cuantificadores de Lua ?
, *
, +
y -
.
En el patrón (%d+)?
, el signo de interrogación "pierde" su significado especial y simplemente coincidirá con el literal ?
como puede ver al ejecutar las siguientes líneas de código:
text = "a?"
first_match = text:match("((%w+)?)")
print(first_match)
que se imprimirá:
a?
AFAIK, lo más cercano que puedes venir en Lua sería usar el patrón:
^eng?l?i?s?h?$
que (por supuesto) coincide con una cadena como "enh"
, "enls"
, ... también.
En Lua, los paréntesis solo se usan para capturar. Ellos no crean átomos.
Lo más cerca que puede llegar a los patrones que desea es:
''^flyi?n?g?$''
''^en?g?l?i?s?h?$''
Si necesita la potencia máxima de un motor de expresión regular, hay enlaces a motores comunes disponibles para Lua. También hay LPeg, una biblioteca para crear PEG , que viene con un motor de expresión regular como ejemplo (no estoy seguro de lo poderoso que es).