Molti programmatori conoscono la gioia di creare una rapida espressione regolare, in questi giorni spesso con l'aiuto di alcuni servizi web, o più tradizionalmente su richiesta interattiva, o forse scrivendo un piccolo script che ha l'espressione regolare in fase di sviluppo e una raccolta di casi di test . In entrambi i casi il processo è iterativo e abbastanza veloce: continua a hackerare sulla stringa dall'aspetto criptico fino a quando non corrisponde e cattura ciò che vuoi e rifiuta ciò che non vuoi.
Per un semplice caso il risultato potrebbe essere qualcosa del genere, come un regexp Java:
Pattern re = Pattern.compile(
"^\\s*(?:(?:([\\d]+)\\s*:\\s*)?(?:([\\d]+)\\s*:\\s*))?([\\d]+)(?:\\s*[.,]\\s*([0-9]+))?\\s*$"
);
Molti programmatori conoscono anche il dolore della necessità di modificare un'espressione regolare o semplicemente di codificare un'espressione regolare in una base di codice legacy. Con un po 'di editing per dividerlo, sopra regexp è ancora molto facile da capire per chiunque abbia ragionevolmente familiarità con regexps, e un veterano di regexp dovrebbe vedere subito cosa fa (rispondere alla fine del post, nel caso in cui qualcuno desideri l'esercizio di capirlo da soli).
Tuttavia, le cose non hanno bisogno di diventare molto più complesse perché una regexp diventi una cosa veramente di sola scrittura, e anche con una documentazione diligente (cosa che tutti ovviamente fanno per tutte le regexps complesse che scrivono ...), la modifica delle regexps diventa un compito arduo. Può anche essere un compito molto pericoloso, se regexp non è accuratamente testato dall'unità (ma tutti ovviamente hanno test unitari completi per tutte le loro complesse regexps, sia positive che negative ...).
Quindi, per farla breve, esiste una soluzione / alternativa in lettura e scrittura per le espressioni regolari senza perdere il loro potere? Come sarebbe il regexp sopra con un approccio alternativo? Qualsiasi lingua va bene, sebbene una soluzione multilingue sia la migliore, nella misura in cui i regexps sono multilingue.
E poi, ciò che fa il regexp precedente è questo: analizzare una stringa di numeri in formato 1:2:3.4
, catturando ogni numero, dove gli spazi sono consentiti e solo 3
è richiesto.