simbolos - regex c#
Emparejamiento del patrĂ³n Lua vs. expresiones regulares (3)
¿Hay alguna muestra común donde la coincidencia de patrones lua sea "mejor" en comparación con la expresión regular?
No se trata tanto de ejemplos particulares como que los patrones Lua tienen una relación señal-ruido más alta que las expresiones regulares POSIX. Es el diseño general que a menudo es preferible, no ejemplos particulares.
Aquí hay algunos factores que contribuyen al buen diseño:
Sintaxis muy ligera para emparejar tipos de caracteres comunes, incluyendo letras mayúsculas (
%u
), dígitos decimales (%d
), caracteres espaciales (%s
), etc. Cualquier tipo de carácter se puede complementar con la letra mayúscula correspondiente, de modo que el patrón%S
coincide con cualquier carácter no espacial.Citar es extremadamente simple y regular. El carácter de comillas es
%
, por lo que siempre es distinto del carácter de comillas de cadenas/
, lo que hace que los patrones de Lua sean mucho más fáciles de leer que las expresiones regulares de POSIX (cuando se necesita hacer citas). Siempre es seguro citar símbolos, y nunca es necesario citar letras, así que puedes seguir esa regla de oro en lugar de memorizar qué símbolos son metacaracteres especiales.Lua ofrece "capturas" y puede devolver múltiples capturas como resultado de una llamada de
match
. Esta interfaz es mucho, mucho mejor que capturar subcadenas mediante efectos secundarios o tener algún estado oculto que deba ser interrogado para encontrar capturas. La sintaxis de captura es simple: solo use paréntesis.Lua tiene un modificador de "coincidencia más corta" para acompañar al operador de "coincidencia más larga"
*
. Entonces, por ejemplos:find ''%s(%S-)%.''
encuentra la secuencia más corta de caracteres no espaciales que está precedida por espacio y seguida de un punto.El poder expresivo de los patrones de Lua es comparable a las expresiones regulares POSIX "básicas", sin el operador de alternancia
|
. Lo que estás abandonando es expresiones regulares "extendidas" con|
. Si necesitas tanto poder expresivo, recomiendo llegar hasta LPEG que te proporciona esencialmente el poder de las gramáticas libres de contexto a un costo bastante razonable.
Actualmente estoy aprendiendo lua. con respecto a la coincidencia de patrones en lua encontré la siguiente oración en la documentación de 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 de POSIX.
Como estoy familiarizado con las expresiones regulares de posix, me gustaría saber si hay muestras comunes en las que la coincidencia de patrones de lua es "mejor" en comparación con la expresión regular, o ¿interpreté mal la oración? y si hay algún ejemplo común: ¿por qué es más adecuada una coincidencia de patrones vs. expresiones regulares?
Ok, solo una pequeña nota de novato para esta discusión; Particularmente me confundí con esta página:
ya que ese dice /s
coincide con el espacio en blanco, como sé por otras sintaxis de expresiones regulares ... Y entonces lo intento en un shell:
$ 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 que /s
no se reconoce aquí, así que esa página probablemente se refiere a la expresión regular en Buscar / Reemplazar de Scite, no a la sintaxis de expresiones regulares de Lua (que también usa Scite).
Luego releo el wiki de lua-users: Patterns Tutorial , y empiezo a recibir el comentario sobre el carácter de escape siendo %
, not /
in @NormanRamsey . Entonces, probando esto:
> print("_".. c:match("[%s]*") .."_")
_ _
... de hecho funciona
Entonces, como originalmente pensé que los "patrones" de Lua son diferentes comandos / motor de la "expresión regular" de Lua, creo que una mejor manera de decirlo es que los "patrones" de Lua son la sintaxis / motor de expresión regular específica de Lua ( en otras palabras, no hay dos de ellos :)
)
¡Aclamaciones!
http://lua-users.org/wiki/LibrariesAndBindings contiene una lista de funcionalidad que incluye bibliotecas de expresiones regulares si desea continuar usándolas.
Para responder la pregunta (y tener en cuenta que de ninguna manera soy un gurú de Lua), el lenguaje tiene una fuerte tradición de ser utilizado en aplicaciones integradas, donde un motor de expresiones regulares completo aumentaría indebidamente el tamaño del código que se usa en la plataforma , a veces mucho más grande que solo toda la biblioteca de Lua.
[Editar] Acabo de encontrar en la versión en línea de Programación en Lua (un excelente recurso para aprender el idioma) donde esto se describe por uno de los principios del lenguaje: ver los comentarios a continuación [/ Editar]
Encuentro personalmente que el patrón predeterminado que coincide con Lua satisface la mayoría de mis necesidades de regex-y. Su experiencia puede ser diferente.