test solo regulares regular probar online numeros expresiones expresion especiales espacio ejemplos crear caracteres blanco alfanumerico regex syntax

regex - solo - ¿Por qué la gente defiende la sintaxis de expresiones regulares?



javascript regex test (19)

¡¡funciona!!
si hay un lenguaje fácil de leer que tiene extensiones en todos los lenguajes de programación principales y está bien documentado y probado y no está tan comprimido como regex, pero tampoco demasiado detallado (verboso = irritante), me encantaría saber más al respecto

Hay una pregunta similar dando vueltas, pero acaba de obtener las mismas respuestas antiguas que la gente siempre da sobre la sintaxis de Regex, pero ese no es el punto aquí, así que por favor intente no arrojar las mismas respuestas antiguas sobre la sintaxis de expresiones regulares. Intenta ser un poco más original y personal al respecto esta vez.

La sintaxis de Regex es MUY compacta, casi demasiado compacta para ser buena. Es como el golf de código, y todos están de acuerdo en que el golf de código no es algo bueno en el código de producción. Sin embargo, la mayoría de la gente acepta la sintaxis de expresiones regulares, lo que parece ... contradictorio por decir lo menos.

Así que ahora algunas de las defensas comunes que uno probablemente escuche incluyen:

  • Respuesta : es compacto

  • Contador : ¿acaso no todos hemos estado de acuerdo en que el código debe ser alfabetizado y una variable como "cliente" es mejor que "c"?

  • Respuesta : es un "lenguaje específico de dominio"

  • Contador : ¿qué hay de todos los lenguajes de dominio bastante fáciles de entender, no compactos, no crípticos y me atrevo a decir, como SQL o LINQ?

  • Respuesta : Es fácil de entender una vez que lo sabes.

  • Contador : la mayoría de los idiomas geniales son fáciles de entender, incluso si nunca los ha usado antes. Por ejemplo, cualquiera podría saltar a Python muy fácilmente, incluso si nunca lo hubieran visto antes. ¿Y por qué la gente defiende a Regex cuando se trata de un lenguaje tan difícil de analizar, pero luego continúa y se queja del paréntesis Lisp?

Ok, ahora todos tratan de ser originales y honestos aquí, no solo saquen las mismas viejas respuestas automáticas que los programadores usaron hace 20 años para diseñar expresiones regulares. A menos que realmente crea que son proposiciones válidas en este día y edad.

Editar: para el registro, sé Regex de años atrás, utilícelos con frecuencia incluso hoy e incluso podría asimilarlos. Sin embargo, de repente tuve la sensación de que quizás era hora de reconsiderar las cosas que había tomado como "verdades" sobre la expresión regular, y mirarlas desde un punto de vista moderno. Principalmente porque los principios de cuestionamiento son necesarios para un mayor desarrollo, y debido a que muchos recién llegados se quejan con vehemencia acerca de ellos, no pueden simplemente ser perfectos, así que decidí intentar ponerme en la piel de un recién llegado y considerar cuáles son algunos puntos buenos. contra regex.

En cuanto a ser subjetivo , no creo que esto sea menos subjetivo o menos relacionado con el programador que los chistes del programador de cosas del día. Por el contrario, está muy relacionado con el programador.

En cuanto a argumentativo , ese es el punto de la pregunta. Para obtener buenos argumentos a favor y en contra de la sintaxis obsoleta, puede servir a los recién llegados para comprender mejor por qué Regex son lo que son, y aún mejor, obtener un recién llegado para encontrar una mejor solución que los viejos estadounidenses no puedan ver porque están cegados por la "frialdad" de la expresión regular.

Citar:

La documentación de Perl 5.10 para expresiones regulares se ha fundido en un montón de unidades ilegibles ilegibles porque tantas características extrañas se han introducido en la sintaxis que nadie puede escribir documentación sensible para ella.

¿Estás tratando de decir que Regex se ha vuelto inmanejable? ¿Entonces como buenos programadores deberíamos considerar refactorizarlos? ¿Tal vez limpiar e intentar como lo hemos hecho con muchas otras tecnologías?


Algunos de los problemas con expresiones regulares no es el lenguaje en sí, sino lo que las personas intentan usar. Escribirán líneas y líneas de expresiones regulares cuando lo que realmente quieren es un analizador bastante simple.

Los regex son geniales para la coincidencia de subcadenas y la extracción de datos entre simples y moderadamente complicadas. Pero en algún punto de complejidad simplemente tienes que sacar el compilador-compilador y escribir un analizador real. Creo que muchas personas no se dan cuenta de que las expresiones regulares son principalmente para hacer coincidir, no para analizar.


Como dijo Adam, ¿hay algo mejor? Me estremece pensar en intentar hacer un montón de operaciones strcmp en lugar de una buena expresión regular. Al igual que cualquier lenguaje expresivo, es posible abusar de la expresión regular y hacer construcciones muy ilegibles, pero a menudo incluso una expresión regular aparentemente ilegible tiene mucho más sentido que el código de procedimiento equivalente para lograr lo mismo.

Sin la expresión regular, tendría que escribir su propia rutina para analizar, retroceder, comparar, almacenar índices, realizar sustituciones y administrar todos los resultados. Regex te da todo eso en una forma muy expresiva. No me gusta repetir el código, pero si tuviera que codificar mi propio analizador cada vez que tuviera que buscar un patrón moderadamente complejo ... No sé qué haría.

Sí, hay diferentes sabores de expresiones regulares, pero la mayoría de los más populares son muy similares, y cualquiera que sea el idioma en el que los utilice generalmente tiene documentación que lo ayuda a leerlo.


Creo que un lenguaje de expresiones regulares similar a SQL sería un proyecto fascinante. Me encantaría ver a alguien crear eso.

¿Por qué no tener un lenguaje donde puedes escribir

LOOK FOR "<TAG"

THEN WORDBOUNDARY THEN ZERO-OR-MORE NOT(''>'') FOLLOWED-BY ''>''

THEN ZERO-OR-MORE SOMETHING REMEMBERED

THEN NEAREST "</TAG>"

Aunque no estoy seguro de quién es el público objetivo, no creo que lo use, porque he pasado todo este tiempo aprendiendo expresiones regulares.

Seguramente, el conjunto de "personas que necesitan usar una expresión tan compleja como esa" se corresponde con el conjunto de programadores que tienen que lidiar con cosas igual de complejas y más a diario.


Deberías mirar las expresiones regulares como herramientas eléctricas de alta gama (y me refiero a las herramientas eléctricas en el sentido de la industria de la construcción).

Si está construyendo una pequeña mesa de trabajo para su cobertizo, no debe sacar la pistola de clavos, la motosierra y el enrutador industrial. Usas una sierra, algunas uñas y un martillo.

Del mismo modo, no construyes un edificio de 30 pisos sin una grúa en alguna parte.

La idea es usar la herramienta adecuada para el trabajo Y la herramienta adecuada para su nivel de habilidad.

Si tiene que cortar un árbol, asegúrese de saber todo sobre el contragolpe antes de poner en marcha la motosierra. Si no lo hace, use una sierra de mano en su lugar y ahórrese un viaje al hospital para volver a colocar su miembro amputado.

Utilizo expresiones regulares de la misma forma en que uso mi motosierra, con mucho cuidado. Si no se siente cómodo con la herramienta, no la use. Una vez que aprenda cómo usarlo correctamente, le resultará mucho más fácil hacer las cosas más rápido.


Defendería la sintaxis de expresiones regulares porque coincide (aproximadamente) con la notación que aprendí cuando hice mi curso de Algoritmos y máquinas. Es una forma fácil de generar una máquina para ingerir el lenguaje regular especificado.

La sintaxis de expresiones regulares es la forma en que es porque es todo lo que necesita para describir completamente el comportamiento que está buscando.


En realidad, es una conspiración perpetuada por la Asociación Estadounidense de Programadores Jubilados contra los jóvenes traficantes de hoy en día que cortan sus dientes en Python y Java. Necesitamos mantener un sentido de asombro y respeto por los místicos cuya astucia superó los desafíos de los recuerdos diminutos y los lenguajes arcanos con mnemónicos de 3 caracteres ... y me gustó . Cuesta arriba ... en ambos sentidos ... en la nieve. :-)


Es lo que es ... principalmente por razones tradicionales como usted señaló correctamente. Ahora

  • Reentrenamiento y reorganización : ha ganado un gran número de seguidores y las raíces han crecido demasiado para una revisión, incluso si alguien quiere. La gente ha aprendido las arcanas reglas y ha desarrollado su bolsa de trucos, comunidades y herramientas (conecto Expresso).
  • Amplia compatibilidad : la sintaxis actual es ampliamente compatible en todas las plataformas. Reescribir ese nivel de soporte es una tarea enorme, incluso si se descuenta la monumental tarea de escribir su propio motor y manejar todos los casos adicionales.
  • Reg Exp es menos probable que cambie Finalmente, y lo más importante, RegExp no se puede equiparar al código wrt legibilidad. Personalmente utilizo una expresión regular con moderación y para incisiones rápidas, donde sus ventajas superan los beneficios. (por ejemplo, una herramienta interna para raspar la hoja de cálculo de Excel del cliente en un formato XML ideado por -para el desarrollador de forma limpia.) Regexps no debería necesitar mantenimiento y modificación ... si es muy complejo ... enmascare el olor con un comentario (y solo debería ser una vez). Si encuentra que la expresión regular se modifica con regularidad (o si nadie más en su lugar de trabajo conoce las expresiones regulares), probablemente fue una mala elección y debe cambiar al código regular.

Personalmente encuentro que las expresiones regulares (al menos la sección requerida para las tareas de rutina) son fáciles de recoger ... un día o 2. Las cosas avanzadas son difíciles (segunda mitad del libro de MasteringRegExp) pero tampoco las necesita a menudo.


La mayoría de lo que tengo que decir fueron abordados por Adam y DGM, pero no creo que cubran tu segundo punto muy bien.

"¿Qué tal todo lo fácil de entender, no compacto, no críptico y me atrevería a decir lenguajes de dominio bonitos como SQL o LINQ?"

Creo que una buena forma de expresar una respuesta es preguntando, ¿cómo usarías el inglés para explicar una expresión regular?

<TAG/b[^>]*>(.*?)</TAG>

Busque "<TAG" un límite de palabras cero o más de algo que no sea ''>'' seguido de un ''>'' recuerde cero o más de algo, deteniéndose al principio "</ TAG>"

Esta es una expresión regular bastante simple. ¿Es la forma en inglés realmente más fácil de entender? ¿Podrías hacerlo mejor?

Las expresiones regulares son difíciles de leer, pero lo que quiere de ellas puede ser tan difícil de explicar.


Mire el otro lado de la pregunta: ¿cómo diseñaría una nueva sintaxis que incorpore todas las características, consistencia, concisión y solidez como expresiones regulares, pero que sea más amigable con los programadores?


Otro problema con la expresión regular es que hay muchos sabores de ella. .Net regex vs php regex vs other regex, todos se parecen pero no dan el mismo resultado (a veces no hay ningún resultado).


Pyparsing ( http://pyparsing.wikispaces.com/Examples ) es una biblioteca de Python que facilita la escritura de expresiones similares a expresiones regulares que son altamente legibles, como estas líneas que analizarán "Hello, World!":

from pyparsing import Word, alphas greet = Word( alphas ) + "," + Word( alphas ) + "!" greet.parseString("Hello, World!")

Parece que la biblioteca está muy cerca de poder igualar el poder de las expresiones regulares (consulte la página de ejemplos mencionada anteriormente).


Repasando la pregunta similar que mencionaste y sus respuestas, vi algunos intentos de crear sintaxis alternativas "más amigables", tanto de los partidarios como de los detractores de las expresiones regulares tal como las conocemos hoy.

Encontré que son uniformemente menos legibles que expresiones equivalentes equivalentes.

Ahora, concedido, soy un usuario habitual de expresiones regulares, por lo que estoy seguro de que mi comodidad con ellos es una parte importante de esto. Pero mi principal problema con ellos no era la falta de familiaridad, sino más bien que rápidamente crecieron demasiado para abarcar todo de una vez. Cuando su expresión regular de 20 caracteres se convierte en una expresión pseudo-inglesa de 10 líneas por 30, se vuelve mucho más difícil ver cómo las partes se relacionan entre sí.

Tal vez alguien presente una sintaxis alternativa para expresiones regulares que sea universalmente más legible, incluso en casos complejos, pero presento que tal sintaxis requeriría inherentemente algunas equivalentes a llamadas de subrutinas. No escribimos bloques de 200 líneas de código de aplicación con 15 capas de lógica anidada porque sería una tarea monumental solo rastrear su lógica, sin importar qué es lo que realmente hace. Si vamos a explotar las expresiones regulares en una forma más similar al inglés, se producirá el mismo problema y necesitaremos las mismas herramientas para administrarlo.


Son similares a la notación BNF y similares, la base de muchas buenas especificaciones de lenguaje. Por lo tanto, tiene sentido que una notación como esta se use en lexers para indicar clases de caracteres esperados. Los símbolos básicos realmente no son tan crípticos.

Luego creo que fue la idea de UNIX-do-all-you-can-in-one-line que se hizo cargo. Después de las mejoras en los scripts sed y grep, las expresiones regulares adquirieron nuevos poderes pero denotaciones taquigráficas para ellos. Larry Wall los incorporó a Perl como una herramienta general para analizar texto. Supongo que retuvo compacidad para los oneliner que aún eran importantes con perl. Y había nombres abreviados para las clases de caracteres comunes, y se le pidió aún más poder y se le dio a los regexes. Por supuesto, dado que Perl también era un lenguaje de módulos, la sintaxis de expresiones regulares también funcionaba en bloques de enunciados y aprovechaba la sintaxis que era más ampliamente conocida.

Su incorporación a Java es realmente lo que hizo que la gente los mirara, IMO. Java no hizo nada para acomodarlos. Y como resultado, las expresiones con barras invertidas de dificultad moderada se convirtieron en densas junglas de barras invertidas. Java dio a las expresiones regulares un nuevo mercado si se quiere, pero es su forma más atroz. Si los ha visto y no ha prestado más atención, puede pensar que la expresión regular es algo que no debería ser.

Es interesante que, dada la sintaxis suficientemente clara, para la versión detallada de Ambrose, alguien podría idear un módulo para Perl que pudiera tomar la expresión regular verbosa y "compilarla" en una expresión regular compacta que Perl comprenda, utilizando expresiones regulares más simples mediante overload::constants o posiblemente una gramática Parse::RecDescent .


Una expresión regular (al menos originalmente) describe un lenguaje regular. Los lenguajes regulares tienen propiedades teóricas muy agradables, ya que ambos pueden describirse por y describir un autómata finito determinista. Los DFA para expresiones regulares no triviales son difíciles de codificar a mano.

Más importante aún, los compiladores de expresiones regulares utilizados en el back-end de perl, etc. son muy buenos en lo que hacen. Sería muy difícil sintonizar manualmente un código de rendimiento competitivo.

Finalmente, su existencia es en gran parte un artefacto histórico. Han existido desde hace mucho tiempo, se han llevado la atención, mucha gente los conoce. Una herramienta que usted tiene y que otras personas pueden soportar es mucho mejor que una herramienta teórica que aún no existe.

Si solo es la sintaxis la que lo desconecta, tal vez debería considerar buscar los combinadores de analizadores en Haskell. Pueden expresar un superconjunto de las mismas ideas y tener una sintaxis más explícita.


Otros han insinuado esto, pero tiene que decir explícitamente:

Los idiomas regulares no son como los lenguajes de programación. Están más cerca de la notación matemática.

La compacidad y la extravagancia es más un resultado de intentar forzar una notación precisa de los caracteres ASCII que un intento deliberado de brevedad u ofuscación.


Tus contraargumentos son engañosos. ¿Conoces la sintaxis de expresiones regulares o estás discutiendo desde un punto de ignorancia? Es un punto importante para establecer su parcialidad.

  • No es para nada como el golf de código. No estoy seguro de tu conexión allí. ¿Por qué no se quejan de punteros u otra cosa usando el mismo argumento?

  • La compacidad de la expresión regular no tiene nada que ver con nombres de variables pobres. Una variable llamada c podría ser cualquier cosa. La sintaxis de expresiones regulares no es ambigua ni vaga. Describe exactamente su patrón.

  • Es un DSL. ¿Y qué si es? ¿Alguna vez has intentado hacer cosas complejas en SQL? Es un gran desastre también. Hacer lo mismo requiere más mecanografía y más sintaxis no mejora la situación. La mayoría de las personas que enseño tienen problemas con las expresiones regulares porque no están acostumbradas a pensar y diseñar patrones, no porque la sintaxis sea exótica.

  • Es fácil de entender una vez que lo sabes. Bueno, lo es. Las herramientas eléctricas no están optimizadas para los novatos o para las personas que no están dispuestas a aprender. No me quejo del paréntesis de Lisp, pero no me importa la sintaxis de la expresión regular.

Si no quiere usar expresiones regulares, entonces no. Use las funciones de manipulación de cadenas o analizadores sintácticos. Usa alguna otra herramienta. Mientras estés ocupado con eso, estaré diez problemas por delante porque no estoy nadando contra corriente o culpando a las herramientas por el trabajo que no puedo hacer.

Depende de usted la cantidad de trabajo que desea hacer. Encuentre la herramienta que lo lleve más rápido y aprenda. Si no te gusta, inventa algo mejor. Hasta entonces, deja de quejarte.


Apuesto a que todos los participantes en esta discusión aceptarán que para ciertos pequeños códigos de expresiones regulares uno debería escribir un párrafo largo en inglés que describa lo que hace. Cualquier tipo de lenguaje que se pueda usar para hacer lo que incluso la expresión regular más simple describe probablemente lo haga con N líneas de código, donde N (probablemente) crece exponencialmente en comparación con la longitud de la expresión regular en sí misma.


Desde el módulo perl Regexp :: English :

Regexp :: English proporciona una sintaxis de expresión regular alternativa, una que es un poco más detallada que los mecanismos estándar. Además, agrega algunas características convenientes, como la creación de expresiones incrementales y las capturas encuadernadas.

use Regexp::English; my $re = Regexp::English -> start_of_line -> literal(''Flippers'') -> literal('':'') -> optional -> whitespace_char -> end -> remember -> multiple -> digit; while (<INPUT>) { if (my $match = $re->match($_)) { print "$match/n"; } }