Pregunta

Actualmente estoy aprendiendo lua. respecto de patrones en Lua me encontré con la siguiente frase en la documentación lua en lua.org:

  

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.

Como estoy familiarizado con las expresiones regulares POSIX Me gustaría saber si hay muestras comunes donde el patrón lua juego es "mejor" en comparación con expresiones regulares - o hice mal interpretar la frase? y si hay ejemplos comunes: ¿por qué es cualquiera de coincidencia de patrones frente a las expresiones regulares más adecuados

?
¿Fue útil?

Solución

  

¿Hay muestras comunes donde lua coincidencia de patrones es "mejor" en comparación con la expresión regular?

No es ejemplos tanto particulares como Lua que los patrones tienen una mayor relación señal-ruido que las expresiones regulares POSIX. Es el diseño general que es a menudo preferible, no ejemplos particulares.

Aquí están algunos factores que contribuyen al buen diseño:

  • sintaxis muy ligera para hacer coincidir los tipos de caracteres comunes, incluyendo letras mayúsculas (%u), dígitos decimales (%d), los caracteres de espacio (%s) y así sucesivamente. Cualquier tipo de carácter se puede complementar con el uso de la letra mayúscula correspondiente, por lo que el patrón %S coincide con cualquier carácter no-espacio.

  • Citando es extremadamente simple y regular. El carácter es % citando, por lo que siempre es distinta de la cadena de caracteres \-citar, lo que hace que los patrones de Lua mucho más fácil de leer que las expresiones regulares POSIX (al citar es necesario). Siempre es más seguro para citar símbolos, y nunca es necesario citar las cartas, por lo que sólo puede ir por esa regla de oro en lugar de memorizar lo que los símbolos son meta-caracteres especiales.

  • ofertas Lua "captura" y puede devolver múltiples capturas como el resultado de una llamada match. Esta interfaz es mucho, mucho mejor que la captura de subcadenas a través de efectos secundarios o tener algún estado oculto que tiene que ser interrogado para encontrar capturas. Captura de sintaxis es simple:. paréntesis, sólo tiene que utilizar

  • Lua tiene una "coincidencia más corta" modificador - para ir junto con el "partido más largo" operador *. Así, por ejemplo s:find '%s(%S-)%.' encuentra la secuencia más corta de caracteres no-espacio que está precedido por el espacio y seguido de un punto.

  • La potencia expresiva de patrones Lua es comparable a POSIX expresiones regulares "básicas", sin la | operador alternancia. Lo que se está renunciando a "extenderse" expresiones regulares con |. Si necesita que gran fuerza expresiva recomiendo ir todo el camino a LPEG que le da esencialmente el poder de las gramáticas libres de contexto a un costo bastante razonable.

Otros consejos

http://lua-users.org/wiki/LibrariesAndBindings contiene una lista de funcionalidad incluyendo bibliotecas de expresiones regulares si desea continuar con ellos.

Para responder a la pregunta (y nota que soy de ninguna manera un gurú LUA), el lenguaje tiene una fuerte tradición de ser utilizada en aplicaciones embebidas, donde un motor de expresiones regulares completo indebidamente aumentar el tamaño del código que está siendo utilizado en la plataforma, a veces mucho más grande que acaba de toda la biblioteca de Lua sí mismo.

[Editar] acabo de encontrar en la versión en línea de la programación en Lua (un excelente recurso para el aprendizaje de la lengua), donde este es descrito por uno de los principios de la lengua: ver los comentarios a continuación [/ Editar]

Me parece personalmente que el patrón predeterminado coincidente Lua ofrece satisface la mayor parte de mis necesidades de expresiones regulares-y. Su experiencia puede ser diferente.

bien, sólo una ligera nota novato para esta discusión; Particularmente se confundió por esta página:

SciTE expresiones regulares

ya que uno dice coincidencias \s espacios en blanco, como sé por otras sintaxis de expresiones regulares ... Y así que estoy tratando en una concha:

$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> c="   d"
> print(c:match(" "))

> print(c:match("."))

> print(c:match("\s"))
nil
> print("_".. c:match("[ ]") .."_")
_ _
> print("_".. c:match("[ ]*") .."_")
_   _
> print("_".. c:match("[\s]*") .."_")
__

Hmmm ... parece \s no ser reconocido aquí - de manera que la página probablemente se refiere a la expresión regular en Búsqueda de Scite / Reemplazar - no a la sintaxis de expresiones regulares de Lua (que también Scite usos).

A continuación, releo lua usuarios wiki: Patrones Tutorial , y comienza a recibir el comentario acerca el carácter de escape ser %, no \ en @NormanRamsey 's respuesta. Por lo tanto, intentar esto:

> print("_".. c:match("[%s]*") .."_")
_   _

... en realidad funciona.

Así que, como principio pensé que los "patrones" de Lua son diferentes comandos / motor de "expresión regular" de Lua, supongo que una mejor manera de decirlo es: "patrones" de Lua son Lua específico de "expresión regular" sintaxis / motor (en otras palabras, no hay dos de ellos :))

Saludos!

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