Pregunta

He estado jugando con esto por una hora o remolque y haber encontrado mi en un control de carretera con las utilidades de coincidencia de patrones Lua. Estoy intentando hacer coincidir todo el texto citado en una cadena y sustituirla si es necesario.

El patrón me han llegado con la medida es: (\ [\ "\ ']?) (.-)% 1

Estos trabajos en algunos casos pero, no 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 no funciona me gustaría para que coincida con (he hecho una función que obtiene los partidos que deseo, sólo estoy en busca de un patrón para su uso con gsub y curioso si un patrón lua puede hacer esto):

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

Voy a seguir usando mi función en lugar, por el momento, pero estoy ansioso por ver si hay un patrón que podría / debería usar y estoy perdiendo algo con los patrones.

(unos pocos ediciones b / c que se olvidó de stackoverflows formatear) (Otro Editar para realizar un ejemplo no html desde que se conduce a suposiciones de que estaba intentar analizar html)

¿Fue útil?

Solución

tratando de igualar escapado, citado texto usando expresiones regulares es como tratar de eliminar las margaritas (y sólo las tarimas) de un campo usando una cortadora de césped.

  

Me hizo una función que obtiene los partidos que deseo

Este es el movimiento correcto.

  

Tengo curiosidad por si un patrón lua puede hacer esto

Desde un punto de vista práctico, incluso si un patrón se puede hacer esto, usted no desea. Desde un punto de vista teórico, que está tratando de encontrar una doble cita que está precedido por un número par de barras invertidas. Esto es definitivamente un lenguaje regular, y la expresión regular que desee sería algo así como los (convenciones Lua citando a) siguiente

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

Y la cadena entre comillas sería el resultado # 2. Pero los patrones Lua son no Las expresiones regulares completos; en particular, no se puede poner un * después de un patrón entre paréntesis. Así Mi conjetura es que este problema no se puede resolver utilizando patrones de LUA, , pero dado que los patrones Lua no son una cosa normal en autómatas teoría, no estoy al tanto de cualquier órgano de la técnica de prueba de que se puede utilizar para probarlo.

Otros consejos

El problema con las citas escapado es que, en general, si hay un número impar de barras invertidas antes de la cita, entonces se escapó, y si hay un número par, no lo es. No creo que Lua de patrones es lo suficientemente potente como para representar esta condición, por lo que si usted necesita el texto de análisis como este, entonces usted debe buscar otra manera. Tal vez se puede iterar a través de la cadena y analizarlo, o usted podría encontrar cada cita a su vez y leer hacia atrás, contando las barras invertidas hasta que encuentre un carácter que no sea la barra invertida (o al principio de la cadena).

Si es absolutamente necesario utilizar patrones, por alguna razón, se podría tratar de hacer esto en un proceso de múltiples pasos. En primer lugar, gsub todas las apariciones de dos barras invertidas en una fila, y reemplazarlos con un valor centinela. Este debe es un valor que aún no se producen en la cadena. Usted podría intentar algo así como "\ 001" si usted sabe esta cadena no contiene caracteres no imprimibles. De todos modos, una vez que se haya reemplazado todas las secuencias de dos barras invertidas seguidas, cualquier barra invertida se dejaron escapar el siguiente carácter. Ahora usted puede aplicar su modelo original, y, finalmente, se puede reemplazar todas las instancias de su valor centinela con dos barras invertidas de nuevo.

lenguaje de patrones de Lua es suficiente para muchos casos simples. Y tiene al menos un truco que no encuentra en un típico paquete de expresiones regulares: una forma para que coincida con el paréntesis equilibrada. Pero tiene sus límites también.

Cuando se superan estos límites, entonces alcanzo LPEG . LPEG es una implementación de un Expresión de análisis Grammer para LUA, y se llevó a cabo por uno de los autores originales de Lua por lo que la adaptación a Lua se hace bastante bien. Un PEG permite la especificación de cualquier cosa de patrones simples a través de gramáticas de las lenguas completas a ser escrito. LPEG compila la gramática a un código de bytes y lo ejecuta de forma extremadamente eficaz.

debe no estar tratando de analizar HTML con expresiones regulares, HTML y XML son no los lenguajes regulares y no puede ser manipulado con éxito con expresiones regulares. Se debe utilizar un analizador de HTML dedicado. Éstos son un montón de explicaciones de por qué .

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