Semplificare le espressioni regolari

Sono convinto che le espressioni regolari siano uno strumento potente per esprimere in modo compatto per esprimere patterns.
Sono però sono anche convinto che per molti problemi siano troppo potenti e che, proprio per il fatto che sono il loro linguaggio e molto compatto, possano essere poco leggibili.

Inoltre quando usate in un linguaggio di programmazione sono un linguaggio nel linguaggio con tutti i problemi che ne derivano. Se per esempio le state usando in Java per fare il matching delle string che iniziano con "C:\" bisogna scrivere qualcosa del tipo:

        assertTrue(path.matches("C:\\\\.*"));

C'e' un modo per semplificare le cose? Io ho provato creando un piccolo DSL.
Si usa così:

        String output = "Killing process 1624...done\n";
        assertThat(output, looksLike("Killing process NNNN...done\n")
                                     .where("NNNN").isA(anyNumber()));

In questo caso il matching è soddisfatto per ogni stringa dove al posto del termine "NNNN" appare un qualsiasi numero.
Questo è  un'altro esempio:

        String path = "C:\\Program Files";
        assertThat(path, looksLike("C:\\<path>")
                                     .where("<path>").isA(anyString()));

In questo caso mi sono inventato il termine "<path>", il bello è che non ci sono vincoli sul nome del termine.
La libreria è poco più di una proof of concept e non gestisce ancora il caso in cui il termine è ripetuto più di una volta. 

Però è funzionante e testata, e presto la metterò online.

Comments

Giorgio Vespucci
A me 'sti DSL mi stanno piacendo sempre di più! :)
Scorre così bene la lettura del codice dei test, dà un senso più di semantica e meno di sintassi :)