Dopo aver esplorato il potenziale delle espressioni regolari all’ indirizzo https://www.umbriaway.eu/2020/04/07/javascript-e-le-regular-expression-illuminazioni-celesti-pronte-all-uso/ , prendiamo in esame una ulteriore applicazione, quella dell’ interrogazione delle stringhe. Nell’ articolo precedente ci siamo soffermati in particolare sul metodo TEST messo a disposizione dall’ oggetto regular expression, ma di fatto abbiamo a disposizione molte frecce utili come il metodo SEARCH per esempio. Del resto l’uso delle espressioni regolari per interrogare una stringa è aggiuntivo rispetto a tutta una serie di funzioni messe a disposizioni da javascript per modellare le stringhe per l’appunto come substring () che estrapola pezzi di stringa anche inserendo dei parametri tra le parentesi, ossia dicendo da dove iniziare e cosa cercare, oppure la proprietà LENGHT che ci fa tirare fuori la lunghezza in caratteri o anche CHARAT per concatenare in coda altre stringhe al posto del consueto PUNTO o anche SLICE (per dividere in pezzi) piuttosto che REPLACE (che sostituisce) o INCLUDES(“li”) che circoscrive tra parentesi degli elementi specifici, o ancora TOUPPERCASE per trasformare tutto in maiuscolo o TOLOWERCASE per trasformare in minuscolo o piuttosto INDEXOF (“o”) che tira fuori l’indice di un certo carattere o tanto altro come STARTSWITH che interroga una stringa a partire da una data posizione. Insomma con la manipolazione classica delle stringhe abbiamo a disposizione una globalità di metodi da scrivere con la sintassi a gobba di cammello (ad esempio toUpperCase) che ricorrere alle regular expression è una risorsa aggiuntiva però molto utile da conoscere. Abbiamo visto che le regular inseriscono tutti i criteri che l’utente deve rispettare per inserire i dati all’ interno del blocco /……./ e alla fine potremmo anche inserire dei parametri del tipo /……./ g oppure /……./i o anche /………/m che significa rispettivamente una ricerca globale nel contesto analizzato, oppure una situazione no case sensitive nel caso della i dove non ci interessa fare differenza tra maiuscole e minuscole o indicazioni per la gestione multinlinea per la m finale. A questo punto prendiamo ad analizzare una stringa dove sono presenti dei nomi, quindi ipotizziamo di dover lavorare sulla seguente frase dove sono presenti tre nomi che vorremmo estrapolare per esempio dal contesto:
Il sodalizio di questi tre nomi Tizio proveniente da non si sa dove, Caio che arriva dall’ isola che non c’è e Sempronio è ormai consolidato da secoli. Oggi l’espressione si utilizza per citare tre nomi comuni qualsiasi, persone ipotetiche che servono come esemplificazioni schematiche o discorsive…
quindi dichiariamo una variabile e definiamo il suo contenuto usando gli apici ` del nuovo ecma script sei che si ottengono con ALT 96 da tastiera:
var testo = `Il sodalizio di questi tre nomi Tizio proveniente da non si sa dove, Caio che arriva dall’ isola che non c’è e Sempronio è ormai consolidato da secoli. Oggi l’espressione si utilizza per citare tre nomi comuni qualsiasi, persone ipotetiche che servono come esemplificazioni schematiche o discorsive`;
document.write(testo);
document.write(“<br><br>”);
Dopodiché dichiariamo una variabile regularexpression che conterrà al suo interno i criteri di ricerca. Per tirare fuori i nomi vediamo che abbiamo un appiglio e cioè quello delle lettere maiuscole visto che i nomi iniziano in questo modo per cui il criterio della stringa dovrà stabilire che serviranno delle lettere maiuscole a sostegno:
var regularexpression = /[A-Z]/;
per capire meglio questa sintassi si faccia riferimento all’ analisi già messa in atto all’ indirizzo https://www.umbriaway.eu/2020/04/07/javascript-e-le-regular-expression-illuminazioni-celesti-pronte-all-uso/ qui semplicemente stiamo dicendo al nostro pattern che l’utente dovrà digitare delle lettere maiuscole all’ interno del campo. Ma non basta perchè i nomi sono seguiti da lettere minuscole e quindi dobbiamo dire al pattern che ALMENO UN CARATTERE minuscolo dovra essere presente a sostegno dopo il primo blocco e questo lo si ottien tramite il +, quindi la nostra formula magica diventa:
var regularexpression = /[A-Z][a-z]+/;
a questo punto aggiungiamo un modificatore alla fine per dire che ci interessa sottoporre questa espressione contestualmente a tutta la globalità del testo presente e questo comando viene semplicemente messo in atto inserendo una g finale:
// inizio script
var regularexpression = /[A-Z][a-z]+/g;
a questo punto possiamo usare il metodo SEARCH per estrapolare la prima occorrenza dove verrà individuata la prima maiuscola quindi:
var exp = /[A-Z] [a-z]+/g;
risultato = testo.search(exp);
document.write(risultato);
document.write(“<br><br>”);
// fine script
che cosa vedrò a video come risultato? Un bel numero zero e il motivo è evidente perché la frase in posizione zero inizia con una maiuscola quindi ripetiamo l’esperimento portando a minuscola la prima lettera. Ripetendo l’esperimento dopo un aggiornamento a video scopro che quello che ottengo adesso è un bel 32 che sta a significare che la prima lettera maiuscola che incontra parte dalla posizione 32 partendo da zero, provare per credere, pardon contare per credere. Infatti la prima lettera maiuscola di Tizio si trova proprio in posizione 32 e questo non è male come punto di partenza per le nostre ricerche. Ma se volessi qualcosa di più potente che mi dice quali sono tutti gli elementi? dovro usare il metodo match al posto di search:
var exp = /[A-Z] [a-z]+/g;
risultato = testo.match(exp);
document.write(risultato);
document.write(“<br><br>”);
che cosa ottengo questa volta a video? Il browser mostrerà: Tizio,Caio,Sempronio,Oggi non male vero? Se volessi tradurre il mio pattern che ha come criterio la ricerca di una maiuscola seguito da minuscole in una ricerca di occorrenze intese come array? Potrei aggiungere
document.write(“Trovate “+res.length+” occorrenze <br>”);
document.write(res);
document.write(“<br><br>”);
il browser a video mostrerebbe:
Trovate 4 occorrenze
Tizio,Caio,Sempronio,Oggi
essendo il tutto diventato un array adesso è semplice estrapolare con operazione mirate elementi target. Per esempio se volessi estrapolare solo Caio che è il primo elemento dell’ armadio partendo da zero mi basterebbe scrivere:
document.write(res[1]);
document.write(“<br><br>”);
per ottenere la scritta CAIO. E se volessi estrapolare un solo elemento alla volta dalla lista array? Lo posso usare utilizzando il metodo EXEC tipico delle espressioni regolari che mantiene memoria di quanto fatto precedentemente:
document.write(exp.exec(testo));
document.write(“<br>”);
Ok adesso proviamo a fare un ultimo esperimento finale, togliamo la g da:
var exp = /[A-Z] [a-z]+/g;
che cosa otterrei a video ad esempio per il metodo EXEC? La domanda ai posteri ma intuitivamente possiamo già capire la portata di quel piccolo modificatore o punto G: EXEC non conserverebbe memoria delle sue operazioni precedenti per esempio da qui l’importanza di saper mettere modificatori performanti quando richiesto.
Commenti recenti