¿Por qué no puede Expresiones Regulares uso de palabras clave en lugar de caracteres?

StackOverflow https://stackoverflow.com/questions/629573

  •  08-07-2019
  •  | 
  •  

Pregunta

Bueno, yo apenas entienden RegEx lo basico, pero ¿por qué no podían diseño es el uso de palabras clave (como SQL) en lugar de algunos críptico caracteres comodines y símbolos?

Es por rendimiento, ya que la Expresión se interpreta/analiza en tiempo de ejecución?(no compilado)

O tal vez por la velocidad de la escritura?Teniendo en cuenta que cuando se aprende un poco "simple" combinaciones de caracteres se hace más fácil para el tipo 1 carácter en lugar de una palabra clave?

¿Fue útil?

Solución

¿Realmente quieres esto ?

Pattern findGamesPattern = Pattern.With.Literal(@"<div")
    .WhiteSpace.Repeat.ZeroOrMore
    .Literal(@"class=""game""").WhiteSpace.Repeat.ZeroOrMore.Literal(@"id=""")
    .NamedGroup("gameId", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal(@"-game""")
    .NamedGroup("content", Pattern.With.Anything.Repeat.Lazy.ZeroOrMore)
    .Literal(@"<!--gameStatus")
    .WhiteSpace.Repeat.ZeroOrMore.Literal("=").WhiteSpace.Repeat.ZeroOrMore
    .NamedGroup("gameState", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal("-->");

Ok, pero es tu funeral , hombre.

Descargue la biblioteca que hace esto aquí:
http://flimflan.com/blog/ReadableRegularExpressions.aspx

Otros consejos

Las expresiones regulares tienen un matemático (en realidad, la teoría del lenguaje) de fondo y están codificados algo así como un fórmula matemática.Usted puede definir un conjunto de reglas, por ejemplo

  • cada personaje es una expresión regular, en representación de sí mismo
  • si a y b son expresiones regulares, entonces a?, a|b y ab son expresiones regulares, también
  • ...

El uso de una palabra clave basada en el lenguaje sería una gran carga para las simples expresiones regulares.La mayoría de las veces, sólo tiene que utilizar una cadena de texto simple como patrón de búsqueda:

grep -R 'main' *.c

O tal vez muy simple patrones:

grep -c ':-[)(]' seidl.txt

Una vez que te acostumbras a las expresiones regulares, esta sintaxis es muy clara y precisa.En las situaciones más complicadas usted probablemente tendrá que utilizar algo más, ya que una gran expresión regular es obviamente difícil de leer.

Perl 6 está dando un paso revolucionario en la legibilidad de expresiones regulares. Considere una dirección del formulario: 100 E Main St Springfield MA 01234

Aquí hay una expresión regular compatible con Perl 5 moderadamente legible para analizar eso (muchos casos de esquina no se manejan):

 m/
     ([1-9]\d*)\s+
     ((?:N|S|E|W)\s+)?
     (\w+(?:\s+\w+)*)\s+
     (ave|ln|st|rd)\s+
     ([:alpha:]+(?:\s+[:alpha:]+)*)\s+
     ([A-Z]{2})\s+
     (\d{5}(?:-\d{4})?)
  /ix;

Esta expresión regular de Perl 6 tiene el mismo comportamiento:

grammar USMailAddress {
     rule  TOP { <addr> <city> <state> <zip> }

     rule  addr { <[1..9]>\d* <direction>?
                  <streetname> <streettype> }
     token direction { N | S | E | W }
     token streetname { \w+ [ \s+ \w+ ]* }
     token streettype {:i ave | ln | rd | st }
     token city { <alpha> [ \s+ <alpha> ]* }
     token state { <[A..Z]>**{2} }
     token zip { \d**{5} [ - \d**{4} ]? }
  }

Una gramática de Perl 6 es una clase, y los tokens son todos métodos invocables. Úselo así:

if $addr ~~ m/^<USMailAddress::TOP>$/ {
     say "$<city>, $<state>";
}

Este ejemplo proviene de una charla que presenté en la Taller Frozen Perl 2009 . La implementación de Rakudo de Perl 6 es lo suficientemente completa como para que este ejemplo funcione hoy.

Bueno, si tuviera palabras clave, ¿cómo las diferenciaría fácilmente del texto que realmente coincide? ¿Cómo manejarías los espacios en blanco?

Texto fuente Empresa: A Dept .: B

Regex estándar:

Company:\s+(.+)\s+Dept.:\s+(.+)

O incluso:

Company: (.+) Dept. (.+)

Regex de palabras clave (intentando realmente no conseguir un hombre de paja ...)

"Company:" whitespace.oneplus group(any.oneplus) whitespace.oneplus "Dept.:" whitespace.oneplus group(any.oneplus)

O simplificado:

"Company:" space group(any.oneplus) space "Dept.:" space group(any.oneplus)

No, probablemente no sea mejor.

Porque corresponde a la teoría del lenguaje formal y su notación matemática.

¡Es culpa de Perl ...!

En realidad, más específicamente, las expresiones regulares provienen del desarrollo temprano de Unix, y la sintaxis concisa era mucho más valorada entonces. El almacenamiento, el tiempo de procesamiento, los terminales físicos, etc., fueron muy limitados, a diferencia de hoy.

La historia de las expresiones regulares en Wikipedia explica más.

Hay alternativas a Regex, pero no estoy seguro de que alguna haya captado realmente.

EDITAR: corregido por John Saunders: Las expresiones regulares fueron popularizadas por Unix, pero primero implementadas por editor QED . Las mismas restricciones de diseño se aplicaron, aún más, a los sistemas anteriores.

En realidad, no, el mundo no comenzó con Unix. Si lees el artículo de Wikipedia, verás que

  

En la década de 1950, el matemático Stephen Cole Kleene describió estos modelos usando su notación matemática llamada conjuntos regulares. El lenguaje SNOBOL fue una implementación temprana de la coincidencia de patrones, pero no idéntica a las expresiones regulares. Ken Thompson incorporó la notación de Kleene en el editor QED como un medio para unir patrones en archivos de texto. Más tarde agregó esta capacidad al editor de Unix ed, lo que eventualmente condujo al uso popular de la herramienta de búsqueda grep de expresiones regulares

Esto es mucho antes que PERL. La entrada de Wikipedia sobre expresiones regulares atribuye las primeras implementaciones de expresiones regulares a Ken Thompson de UNIX fama, quien los implementó en el QED y luego en el editor ed . Supongo que los comandos tenían nombres cortos por razones de rendimiento, pero mucho antes de ser del lado del cliente. Mastering Expressions Regular es un gran libro sobre expresiones regulares, que ofrece la opción de anotar una expresión regular (con el / x bandera) para que sea más fácil de leer y entender.

Porque la idea de las expresiones regulares, como muchas cosas que se originan en UNIX, es que son concisas, lo que favorece la brevedad sobre la legibilidad. Esto es realmente algo bueno. Terminé escribiendo expresiones regulares (en contra de mi mejor juicio) que tienen 15 líneas de largo. Si eso tuviera una sintaxis detallada, no sería una expresión regular, sería un programa.

En realidad, es bastante fácil implementar un " wordier " forma de expresión regular: consulte mi respuesta aquí . En pocas palabras: escriba un puñado de funciones que devuelvan cadenas de expresiones regulares (y tome parámetros si es necesario).

No creo que las palabras clave den ningún beneficio. Las expresiones regulares como tales son complejas pero también muy poderosas.

Lo que creo que es más confuso es que cada biblioteca de soporte inventa su propia sintaxis en lugar de usar (o extender) la expresión regular clásica de Perl (por ejemplo, \ 1, $ 1, {1}, ... para reemplazos y muchos más ejemplos) .

Sé que está respondiendo su pregunta al revés, pero RegExBuddy tiene una función que explica su expresión regular. en inglés simple. Esto podría facilitar un poco el aprendizaje.

Si el idioma que está utilizando admite Posix regexes , puede usarlos.

Un ejemplo:

\d

sería lo mismo que

[:digit:]

La notación de corchetes es mucho más clara en lo que corresponde. Todavía aprendería los & "Caracteres y símbolos crípticos comodín, ya que todavía los verá en el código de otras personas y necesitará comprenderlos.

Hay más ejemplos en la tabla en la página de regular-expressions.info .

Por alguna razón, mi respuesta anterior se borró.De todos modos, yo lo ruby regexp máquina se ajuste el proyecto de ley, en http://www.rubyregexp.sf.net.Es mi propio proyecto, pero creo que debería funcionar.

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