Molti programmatori conoscono la gioia di scatenare un'espressione regolare veloce, in questi giorni spesso con l'aiuto di alcuni servizi Web, o più tradizionalmente al prompt interattivo, o magari scrivendo un piccolo script che ha l'espressione regolare in fase di sviluppo, e una raccolta dei casi di test. In entrambi i casi il processo è iterativo e abbastanza veloce: continua a hackerare la stringa dall'aspetto enigmatico finché non trova corrispondenze e cattura ciò che vuoi e rifiuterà ciò che non vuoi.
Per un semplice caso il risultato potrebbe essere qualcosa di simile a questo, come un'espressione regolare in Java:
Pattern re = Pattern.compile(
"^\s*(?:(?:([\d]+)\s*:\s*)?(?:([\d]+)\s*:\s*))?([\d]+)(?:\s*[.,]\s*([0-9]+))?\s*$"
);
Molti programmatori conoscono anche il dolore di dover modificare un'espressione regolare o semplicemente codificare attorno a un'espressione regolare in una base di codice legacy. Con un po 'di editing per dividerlo, sopra regexp è ancora molto facile da comprendere per chiunque abbia ragionevolmente familiarità con espressioni regolari, e un veterano delle espressioni regolari dovrebbe vedere subito cosa fa (risposta alla fine del post, nel caso qualcuno voglia l'esercizio di capire da soli).
Tuttavia, non è necessario che le cose diventino molto più complesse perché una regexp diventi veramente qualcosa di sola scrittura, e anche con una documentazione diligente (che tutti naturalmente fanno per tutte le espressioni regolari complesse che scrivono ...), la modifica delle espressioni regolari diventa un compito scoraggiante. Può anche essere un compito molto pericoloso, se regexp non viene attentamente testato (ma tutti ovviamente hanno test unitari completi per tutte le loro espressioni regolari complesse, sia positive che negative ...).
Quindi, per farla breve, c'è una soluzione / alternativa di lettura / scrittura per le espressioni regolari senza perdere il loro potere? Come apparirebbe la precedente regexp con un approccio alternativo? Qualsiasi linguaggio va bene, anche se una soluzione multi-lingua sarebbe la migliore, nella misura in cui le espressioni regolari sono multi-lingua.
E poi, ciò che fa la regexp precedente è questa: analizza una stringa di numeri in formato 1:2:3.4
, catturando ciascun numero, dove sono consentiti spazi e solo 3
è richiesto.