Le espressioni regolari in javascript
Un espressione regolare è uno strumento utile per rappresentare un insieme di stringhe. Incominciamo subito con un esempio per far capire immediatamente di cosa stiamo parlando:
1 ^a
- antonio
- anfora
- alla luce del sole (lo spazio è un carattere)
- bullone
- civile
- linguaggio dinamico
Il carattere ^ è un carattere speciale (meta-carattere) e sta proprio ad indicare l’inizio di una linea di testo. Ecco l’elenco dei meta-caratteri:
- . – Ogni singolo carattere
- ^ – Inizio riga
- $ – Fine riga
- + – una o più occorrenze di un carattere o espressione che lo precede
- * – zero o più occorrenze di un carattere o espressione che lo precede
- ? – zero o una occorrenza di un carattere o espressione che lo precede
- {n} – numero di occorrenze corrispondente a n occorrenze di un carattere o espressione che lo precede
- { n,m }- numero di occorrenze compreso tra n e m occorrenze di un carattere o espressione che lo precede (m può essere omesso)
- () – indica una sottoespressione, serve a definire un ordine di priorità per la valutazione dei metacaratteri
- [] – trova un singolo carattere contenuto nell’insieme dei caratteri contenuto al suo interno
- [^] – trova un qualsiasi carattere meno quelli contenuti nell’insieme dei caratteri contenuto al suo interno
- | – indica un alternativa tra due (o più ) caratteri o espressioni
- \ – carattere di escape per i metacaratteri
- \A – Inizio stringa
- \z – Fine stringa
- \w – Qualsiasi carattere che sia una lettera, underscore e numero
- \W – Qualsiasi carattere che non sia una lettera, underscore e numero
- \s – Qualsiasi carattere spazio
- \S – Qualsiasi carattere che non è spazio
- \d – Qualsiasi carattere numerico
- \D – Qualsiasi carattere non numerico
Qualche esempio:
1 ^[a-z]+@[a-z]+(\.it)$
rientra staff@javascriptitalia.it ma non staff0123@javascriptitalia.it
1 \d+-\d+
rientra 089-4450145 oppure 08A9-4450145 ma non 089A-4450145
1 ^[^aeiou]
rientra pollo ma non aiuola
Quando all’interno delle parentesi quadre utilizziamo il trattino stiamo dichiarando una range di valori. [A-Z] indica tutte le lettere dell’alfabeto in maiuscolo le lettere da a a g in minuscolo [A-z] tutte le lettere dell’alfabeto [0-5] tutti i numeri da 0 a 5
L’oggetto RegExp
Costruzione
L’oggetto che ci offre javascript per gestire le espressioni regolari è RegExp. Per istanziare questo oggetto possiamo usare il suo costruttore:
1 var myRegExp = new RegExp("^(a+)"); 2 var myRegExp2 = new RegExp("^(a+)", "g"); 3 var myRegExp3 = /^(a+)/g 4
- g – indica che la ricerca deve essere globale, invece che terminare con la prima occorrenza
- i – la ricerca è case insensitive
- m – la ricerca è mutlilinea
Nel terzo caso, per costruire l’oggetto abbiamo utilizzato un litterale. Il primo slash segnala l’inizio del pattern, il secondo segnala la chiusura. Immediatamente dopo la chiusura possiamo aggiungere i modificatori.
Utilizzo dell’oggetto RegExp
Il metodo compile() ci permette di definire la regular expression a runtime, quindi possiamo utlizzare lo stesso oggetto per diverse regular expression. Accetta come primo parametro l’espressione regolare che vogliamo compilare e un secondo parametro opzionale che è un carattere tra ‘g’, ‘i’ e ‘m’:
1 var myRegExp = /^[^aeiou]/ ; // istanziamo un nuovo oggetto 2 // altro codice dove utilizziamo l'oggetto 3 myRegExp.compile( /\d+-\d+/ ); // qui modifichiamo la regular expression 4
Il metodo exec() esamina la stringa che gli viene data in input e verifica se esiste corrispondenza con l’epressione regolare. Ritorna un oggetto Match Array,un oggetto di convenienza che possiede varie proprietà riguardo al risultato, null altrimenti.
1 var stringa1 = "Hello world!"; 2 var stringa2 = "Albicocca"; 3 4 var pattern = /^[^aeiou]/; 5 6 var risultato = pattern.exec(stringa1); 7 document.write("Valore di ritorno: " + risultato); 8 9 var risultato = pattern.exec(stringa2); 10 document.write("Valore di ritorno: " + risultato);
Il metodo test() ritorna un valore booleano, true se c’è matching tra l’espressione regolare e la stringa in input, false altrimenti.
1 if( /\d+-\d+/.test( "01-05" ) ) { 2 // codice che verrà eseguito 3 } 4 5 else { 6 // codice mai raggiunto 7 }
