Expresiones regulares más entendibles en .NET

Seguramente más de uno que ha tenido la oportunidad de revisar código ajeno donde se hacía uso de expresiones regulares, sufrió de algún modo para entender algunos patrones; esto sucede generalmente porque pocos suelen poner nombres a los grupos que definen y menos aún usan comentarios dentro de los patrones.

El siguiente ejemplo ilustra de manera básica un patrón confuso:

csharp:
using System;
using System.Text.RegularExpressions;

class Program
{
        static void Main(string[] args)
        {
                string patern = @"(https?://)([a-z\d-]+\.)*([a-z\d-]+)((\.[a-zA-Z]+){1,2})(/.*$)?";

                RegexOptions options = RegexOptions.IgnoreCase;

                Match match = Regex.Match("http://google.com", pattern, options);

                foreach (Group group in match.Groups)
                {
                        Console.WriteLine(group.Value);
                }           
        }
}

Ese mismo ejemplo, usando la opción RegexOptions.IgnorePatternWhitespace permite entender más fácilmente la expresión regular mostrada:

csharp:
using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        string pattern = @"
               (?# Ejemplo de comentario: captura el protocolo http o https incluyendo ://)
               (?<protocol>https?://)
               (?<subDomain>[a-z\d-]+\.)*
               # Algún otro comentario relevante #
               (?<domain>[a-z\d-]+)
               (?<TLD>(\.[a-zA-Z]+){1,2})
               (?<requestUri>/.*$)?
           ";       
        RegexOptions options = RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase;

        Match match = Regex.Match("http://google.com", pattern, options);

        foreach (Group group in match.Groups)
        {
            Console.WriteLine(group.Value);
        }
    }
}

Como se puede apreciar, el segundo ejemplo da una idea más clara de lo que captura el patrón definido.

Si desarrollan en .NET y usan expresiones regulares, no hay excusas para hacer sufrir a los que revisan o dan mantenimiento al código que hicieron 😉

4 Replies to “Expresiones regulares más entendibles en .NET”

  1. los comentarios ayudan un poco, pero de cualquier manera el programador tiene que tener conocimiento sobre expresiones regulares

    De acuerdo -el objetivo de la entrada es facilitar el entendimiento de un patrón definido (obviamente se debe tener conocimientos en expresiones regulares)

    una alternativa mucho mas facil y que realmente mejora mucho la legibilidad seria usar una libreria como esta

    http://www.ayende.com/Blog/archive/2006/10/23/7159.aspx

    que implementa el patron fluent interface, y nos libera completamente de la complejidad de RegEx

    En efecto, esa opción es aún mejor para aquellos que no están tan familiarizados con las expresiones regulares -también vi ese artículo en Ayende 🙂 -, gracias por poner el enlace.

Comments are closed.