Cuándo no usar Regex en C # (o Java, C ++, etc.)

Está claro que hay muchos problemas que parecen resolver una simple expresión regular, pero que resultan ser muy difíciles de resolver con expresiones regulares.

Entonces, ¿cómo alguien que no es un experto en expresiones regulares , sabe si debería aprender regex para resolver un problema determinado?

(Consulte “Regex para analizar el código fuente C # para encontrar todas las cadenas” por la forma en que hago esta pregunta).

Esto parece resumirlo bien:

Algunas personas, cuando se enfrentan con un problema, piensan “Lo sé, usaré expresiones regulares”. Ahora tienen dos problemas …

(Acabo de cambiar el título de la pregunta para hacerlo más específico, ya que algunos de los problemas con Regex en C # se resuelven en Perl y JScript, por ejemplo, el hecho de que los dos niveles de cotización hacen que una Regex sea tan ilegible).

No intente usar expresiones regulares para analizar texto jerárquico como fuente de progtwig (o XML nested): se ha demostrado que no son lo suficientemente potentes para eso, por ejemplo, no pueden, para una cadena de parens, averiguar si re equilibrado o no.

Use generadores de analizadores (o tecnologías similares) para eso.

Además, no recomendaría usar Regex para validar datos con estándares formales estrictos, como las direcciones de correo electrónico. Son más difíciles de lo que quieres, y tendrás una expresión regular incorrecta o muy larga.

Hay dos aspectos a considerar:

  • Capacidad: ¿el idioma que intenta reconocer es un lenguaje de Tipo 3 (uno regular)? si es así, entonces puedes usar regex, si no, necesitas una herramienta más poderosa.

  • Mantenibilidad: si lleva más tiempo escribir, probar y comprender una expresión regular que su homólogo programático, entonces no es apropiado. Cómo comprobar esto es complicado, recomiendo la revisión por pares con sus compañeros (si dicen “qué …” cuando lo ven, entonces es demasiado complicado) o simplemente déjalo sin documentar durante unos días y luego toma una mira por ti mismo y mide cuánto tiempo lleva entenderlo.

Soy un principiante cuando se trata de expresiones regulares, pero en mi humilde opinión, vale la pena dedicar algún tiempo a aprender expresiones regulares básicas, te darás cuenta de que muchos, muchos problemas que has resuelto de forma diferente podrían (y quizás deberían) resolverse usando expresiones regulares.

Para un problema en particular, intente encontrar una solución en un sitio como regexlib y vea si puede entender la solución.

Como se indicó anteriormente, la expresión regular podría no ser suficiente para resolver un problema específico, pero navegar por una página como regexlib le indicará si la expresión correcta es la solución correcta para su problema.

Siempre debe aprender expresiones regulares, solo de esta manera puede juzgar cuándo usarlas. Normalmente se vuelven problemáticos cuando necesitas un muy buen rendimiento. Pero a menudo es mucho más fácil usar una expresión regular que escribir una statement de cambio grande.

Eche un vistazo a esta pregunta , que le muestra la elegancia de una expresión regular en contraste con la construcción if () similar …

Use expresiones regulares para reconocer patrones (regulares) en el texto. No lo use para analizar texto en estructuras de datos. No use expresiones regulares cuando la expresión sea muy grande.

A menudo no está claro cuándo no usar una expresión regular. Por ejemplo, no debe usar expresiones regulares para la correcta verificación de la dirección de correo electrónico. Al principio puede parecer fácil, pero la especificación para direcciones de correo electrónico válidas no es tan regular como podría pensar. Puede utilizar una expresión regular para la búsqueda inicial de candidatos de direcciones de correo electrónico. Pero necesita un analizador para verificar realmente si el candidato de dirección cumple con el estándar dado.

Por lo menos, diría que aprendes expresiones regulares solo para que las entiendas completamente y puedas aplicarlas en situaciones donde funcionarían. En la parte superior de mi cabeza usaría expresiones regulares para:

  • Identificación de partes de una cuerda.
  • Verificando si una cadena cumple con un determinado formato o construcción.
  • Encontrar subcadenas que coincidan con un patrón determinado.
  • Transformar cadenas que se ajustan a un patrón determinado en una forma diferente (búsqueda-reemplazo, uso de mayúsculas, etc.).

Las expresiones regulares en un nivel teórico forman los cimientos de lo que es una máquina de estado: en informática, tiene autómatas finitos determinísticos (DFA) y autómatas finitos no deterministas (NFA). Puede usar expresiones regulares para imponer algún tipo de validación en las entradas: los motores de expresiones regulares simplemente interpretan o convierten patrones / cadenas de expresiones regulares en operaciones reales de tiempo de ejecución.

Una vez que sepa si la cadena (o los datos) que desea determinar como válidos podría ser evaluada por un DFA, tiene la opción de implementar ese DFA usted mismo utilizando su propio código o utilizando un motor de expresión regular. Descubrirá que conocer expresiones regulares realmente mejorará su caja de herramientas y su comprensión de cómo el procesamiento de cadenas puede volverse realmente complejo.

Con base en expresiones regulares simples, puede estudiar el análisis de analizadores y cómo funcionan los analizadores. En el nivel más bajo, está analizando el análisis léxico (donde funcionan las expresiones regulares) y en un nivel superior una gramática y acciones semánticas. Estas son las bases sobre las que funcionan los comstackdores e intérpretes, así como las aplicaciones de análisis de protocolo y las aplicaciones de procesamiento / transformación de documentos.

La principal preocupación aquí es la mantenibilidad.

Es obvio para mí, que cualquier progtwigdor digno de su sal debe conocer expresiones regulares. No conocerlos es como, por ejemplo, no saber qué es la abstracción y la encapsulación, solo, probablemente, peor. Entonces esto está fuera de discusión.

Por otro lado, uno debe considerar que el mantenimiento del código dirigido por expresiones regex (escrito en cualquier idioma) puede ser una pesadilla incluso para alguien que es realmente bueno con ellos. Entonces, en mi opinión, el enfoque correcto aquí es usarlos solo cuando sea inevitable y cuando el código que utiliza regex ‘sea más legible que su variante no regex. Y, por supuesto, como ya se indicó, no los use para algo que no están destinados a hacer (como xml). Y tampoco validación de dirección de correo electrónico (una de mis cosas favoritas: P)!

Pero en serio, ¿no te parece incorrecto usar todos esos substratos para algo, que se puede resolver con un puñado de personajes, pareciendo un ruido de línea? Sé que lo hizo por mí.