Comentar expresiones regulares

7

¿Existen prácticas comunes para comentar las expresiones regulares: comentarios en línea que hacen referencia a diferentes partes de RegEx o comentarios generales para todas las expresiones?

    
pregunta m0nhawk 05.12.2012 - 13:00

7 respuestas

9

En mi opinión, una buena práctica es establecer de manera concisa en los comentarios cuál es la idea general de la expresión regular. Esto le ahorra a otros desarrolladores (o, a veces, a usted mismo) la molestia de copiar y pegar la expresión regular en un analizador como RegExr , solo para entender lo que hace .

    
respondido por el pleinolijf 05.12.2012 - 16:14
8

Por lo general, escribiré una expresión regular y no explicaré las partes individuales de la expresión regular, sino cuál es su propósito. Eso es lo que y por qué. Esto es un poco como preguntar "¿Cómo deberían ser mis comentarios?" a lo que uno diría " No escriba lo que hace el código, escriba por qué el código hace lo que hace "

// Strip the leading "?" and remove the query parameters "offset=<integer>" & "count=<integer> so we have a pattern of the request"          
var search = location.search.substring(1).replace(/offset=[0-9]+?&/g, "").replace(/count=[0-9]+?&/g, "");

A menos que esté tratando de enseñar a alguien sobre expresiones regulares mediante comentarios en código, no creo que explique lo que hará cada pieza individual. Cuando trabaje con otros programadores, puede asumir con seguridad que uno sabría algo como expresiones regulares globales.

    
respondido por el Glenn Nelson 05.12.2012 - 17:31
5

Supongo que realmente depende de cómo se arman las expresiones regulares. En términos generales, creo que sería una mala idea poner comentarios dentro de la propia cadena de expresiones regulares (no es posible en la mayoría de los escenarios, que yo sepa). Si realmente necesitas comentar partes específicas de una expresión regular (¿estás tratando de enseñarle a alguien?), Luego divide cada parte en cadenas separadas en sus propias líneas y comenta cada línea usando el proceso de comentarios normal para tu lenguaje de programación. De lo contrario, la respuesta de pleinolijf es bastante buena.

ejemplo:

string myregex = "\s" // Match any whitespace once
+ "\n"  // Match one newline character
+ "[a-zA-Z]";  // Match any letter
    
respondido por el Matt 05.12.2012 - 17:13
5

Esta es, en cierto modo, una respuesta específica del idioma, pero en la pregunta no se menciona ningún idioma.

El libro "Dive Into Python" sugiere implementar comentarios usando Verbose Regular Expressions :

  

Python te permite hacer esto con algo llamado verbose regular   expresiones Una expresión regular verbosa es diferente de una compacta   expresión regular de dos maneras:

     
  • Se omite el espacio en blanco. Los espacios, tabulaciones y retornos de carro no son   emparejados como espacios, pestañas y retornos de carro. No están emparejados en   todos. (Si desea hacer coincidir un espacio en una expresión regular verbosa,   tendrás que escapar de ella colocando una barra invertida delante de ella.)
  •   
  • Los comentarios se ignoran. Un comentario en una expresión regular verbosa es   al igual que un comentario en el código Python: comienza con un carácter # y   Va hasta el final de la línea. En este caso es un comentario dentro de un   cadena multilínea en lugar de dentro de su código fuente, pero funciona   de la misma manera.
  •   

Ejemplo:

>>> pattern = """
^                   # beginning of string
M{0,4}              # thousands - 0 to 4 M's
(CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
                    #            or 500-800 (D, followed by 0 to 3 C's)
(XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
                    #        or 50-80 (L, followed by 0 to 3 X's)
(IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
                    #        or 5-8 (V, followed by 0 to 3 I's)
$                   # end of string
"""
>>> re.search(pattern, 'M', re.VERBOSE)                1

Fuente y más detalles aquí

Este método tiene una pequeña desventaja de que la persona que llama debe saber que el patrón está escrito en un formato detallado y llamarlo en consecuencia.

    
respondido por el Rotem 18.04.2014 - 19:57
3

Por lo general, defino una constante de cadena cuyo nombre describe el propósito general de la expresión regular.

Por ejemplo:

const string FloatingPointNumberPattern = @"[-+]?[0-9]*\.?[0-9]+";

Puedes agregar un comentario sobre esta constante para darle una descripción, pero generalmente el nombre de la constante en sí debería ser suficiente.

    
respondido por el Bernard 24.04.2014 - 02:36
2

Los comentarios deben agregar información útil que no sea evidente a partir del código.

  1. Facilita la comprensión de lo que se supone que debe hacer la expresión a nivel de requisitos, ya sea en el propio código o en un comentario. La intención detrás de la expresión es validar las direcciones de correo electrónico o seleccionar números de teléfono canadienses.
  2. Facilita la comprensión de lo que realmente está haciendo la expresión, es decir, a qué se evalúa la expresión. Primero intente aclararlo dividiendo la expresión, si primero verifica todos los guiones, luego elimine todos los números y luego haga que esa sea una expresión de dos partes con variables que contienen los valores intermedios, hará que sea mucho más fácil de leer y el lector estará capaz de pasar a través de su lógica un paso a la vez. (Hay una respuesta famosa a una pregunta en SE donde alguien está tratando de descifrar algunos códigos antiguos que involucran manipulación de bits '> >' y descubre si hay ciertas marcas de alerta donde se establece la respuesta, no solo lo que realmente hace el código pero cómo debe ser la autenticidad de la pregunta para deconstruir este tipo de código en el futuro, que es exactamente lo que estoy tratando de describir, pero parece que no puedo encontrar la pregunta a la que enlazar)

Hay pocas aplicaciones que necesiten hasta el último ciclo, si está ajustando patrones a conjuntos de datos masivos, tal vez haya una mejor manera, tal vez no, pero para la mayoría de las cosas, el tiempo de ejecución adicional no es tan importante.

Y recuerde que la próxima persona que encuentre su código y corrija un error podría ser usted dentro de seis meses y no hay forma de recordar lo que se suponía que debía hacer.

    
respondido por el Encaitar 24.04.2014 - 01:30
1

Extraiga el RegEx en una clase separada en una con un nombre significativo. Luego documentaría el código con pruebas automatizadas.

Esto asegurará

  • Que el código realmente funciona, también para casos de esquina
  • Asegura que una rápida "corrección de errores" no arruine muchos casos de esquina
  • Puede documentar las optimizaciones en las que se deshabilita el seguimiento de seguimiento

Naturalmente, su clase puede albergar varias expresiones regulares.

    
respondido por el Carlo V. Dango 17.08.2014 - 20:24

Lea otras preguntas en las etiquetas