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.
Scorre così bene la lettura del codice dei test, dà un senso più di semantica e meno di sintassi :)