gmatch lua escaping lua-patterns

lua gmatch



¿Cuál es el patrón de Lua adecuado para el texto citado? (4)

He estado jugando con esto durante una hora o remolque y me he encontrado en un bloque de carreteras con las utilidades de comparación de patrones de Lua. Estoy intentando hacer coincidir todo el texto citado en una cadena y reemplazarlo si es necesario.

El patrón que he encontrado hasta ahora es: (/? [/ "/ '']) (.-)% 1

Esto funciona en algunos casos, pero no en todos los casos:

Working: "This /"is a/" string of /"text to/" test with" Not Working: "T///"his /"is/' a/" string/" of/' text/" to /"test/" wit///"h"

En el ejemplo que no funciona me gustaría que coincida con (hice una función que obtiene las coincidencias que deseo, estoy buscando un patrón para usar con gsub y curioso si un patrón de lua puede hacer esto):

string a" string" of is'' a" string" of'' text test his "is'' a" string" of'' text" to "test" wit

Continuaré usando mi función por el momento, pero tengo curiosidad por saber si hay un patrón que podría / debería estar usando y me falta algo con los patrones.

(algunas ediciones b / c se me olvidó sobre el formateo de stackoverflows) (otra edición para hacer un ejemplo que no sea html ya que me llevaba a suponer que estaba intentando analizar html)


El problema con las comillas escapadas es que, en general, si hay un número impar de barras diagonales inversas antes de la cita, entonces se escapó, y si hay un número par, no es así. No creo que la coincidencia de patrones de Lua sea lo suficientemente poderosa como para representar esta condición, por lo que si necesita analizar un texto como este, entonces debería buscar otra forma. Tal vez puedas iterar a través de la cadena y analizarlo, o podrías encontrar cada cita por turno y leer hacia atrás, contando las barras invertidas hasta que encuentres un carácter que no sea de barra invertida (o el comienzo de la cadena).

Si por alguna razón tiene que usar patrones, puede intentar hacerlo en un proceso de varios pasos. Primero, gsub para todas las ocurrencias de dos barras diagonales inversas en una fila, y reemplácelas con algún valor centinela. Este debe ser un valor que ya no aparece en la cadena. Podría intentar algo como "/ 001" si sabe que esta cadena no contiene caracteres no imprimibles. De todos modos, una vez que haya reemplazado todas las secuencias de dos barras invertidas en una fila, las barras invertidas restantes se escapan del siguiente carácter. Ahora puede aplicar su patrón original, y finalmente puede reemplazar todas las instancias de su valor centinela con dos barras invertidas nuevamente.


El lenguaje de patrones de Lua es adecuado para muchos casos simples. Y tiene al menos un truco que no encuentras en un paquete típico de expresiones regulares: una forma de unir paréntesis equilibrados. Pero también tiene sus límites.

Cuando se exceden esos límites, alcanzo LPeg . LPeg es una implementación de un Grammer de expresión de análisis para Lua, y fue implementado por uno de los autores originales de Lua, por lo que la adaptación a Lua se hace bastante bien. Un PEG permite escribir cualquier cosa, desde patrones simples hasta gramáticas de lenguaje completas. LPeg compila la gramática en un bytecode y la ejecuta de manera extremadamente eficiente.


Tratar de unir el texto escapado y citado usando expresiones regulares es como tratar de eliminar las margaritas (y solo las margaritas) de un campo usando una cortadora de césped.

Hice una función que obtiene los partidos que deseo

Este es el movimiento correcto.

Tengo curiosidad si un patrón lua puede hacer esto

Desde un punto de vista práctico, incluso si un patrón puede hacer esto, no desea hacerlo. Desde un punto de vista teórico, está tratando de encontrar una comilla doble precedida por un número par de barras diagonales inversas. Este es definitivamente un lenguaje regular, y la expresión regular que desea sería algo como lo siguiente (convenciones de cotización de Lua)

[[[^/](//)*"(.-[^/](//)*)"]]

Y la cadena citada sería resultado # 2. Pero los patrones de Lua no son expresiones regulares completas; en particular, no puede poner un * después de un patrón entre paréntesis. Así que supongo que este problema no puede resolverse usando patrones de Lua, pero como los patrones de Lua no son una característica estándar en la teoría de autómatas, no conozco ningún conjunto de técnicas de prueba que pueda usar para probarlo.


NO deberías tratar de analizar HTML con expresiones regulares, HTML y XML NO son lenguajes regulares y no pueden manipularse con éxito con expresiones regulares. Deberías usar un analizador de HTML dedicado. Aquí hay muchas explicaciones por qué .