Javascript e le regular expression parte due: interrogare una stringa

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.

Stai come uno di Ferrara sugli alberi a 50 gradi le foglie?! Allora tutto ciò é di buon auspicio perché la fortuna esiste negli scacchi e probabilmente non morirai assiderato dal caldo!

Ma della partita giocata tra Euwe e Smyslov ne vogliamo parlare giocata al campionato del mondo del 1948 con web developer Umbria? Certo che la fortuna esiste proprio eh a scacchi! Smyslov stava come uno di Bologna sugli alberi ad Agosto! Ebbene il B come si dice in gergo ha apparecchiato bene la tavola, tutti i prezzi sono pronti per l’accoppiamento parafrasando battiato e anche la prima mossa giocata da Euwe é giusta 1 Ceg6!! che scardina la fortezza nemica, la donna non si può prendere causa matto in f8 quindi Smyslov gioca 1..fg6 unica e adesso il Bianco che fa? Al posto di giocare 2 Dg4 con idee del tipo 2..Df7 3 e5 Ce7 4 e6 De8 5 Ch5! oppure anche 2..Af7 3 e5 Ag5 4 e6 Ae8 5 Cxg6 Axg6 6 Df5!! Dg7 7 Df7!! DxD 8 exf7 Axb1 9 f=cavallo matto se ne parte e spara 2 Cxg6 al che il povero Smyslov forzatamente deve di nuovo prendere con serafica calma con la freddezza di un monaco Zen che sta per vedere il nirvana. Adesso dopo 2..Rg6 il bianco avrebbe ancora un forte attacco giocando cose del tipo 3 Df3! Cf6 4 e5 ma Euwe imbambolato riesce a giocare una linea che lo porta al secondo diagramma perdendo la partita. La questione della psicologia degli errori negli scacchi é materia vasta e affascinante. Smyslov aveva studiato da ipnotista? Non lo sappiamo, assistiamo solo a uno scempio di combinazione mancata. Saltando di nuovo nel mondo parallelo della programmazione che ha così tante analogie con quello degli scacchi con web developer Umbria, torniamo a JS. In Java Script tutto quello che non é un a parola chiave é una variabile, tipo pippo=3; alert(pippo); puto=pippo; dove l’alert mostrerà il contenuto della variabile nella finestra del browser e dove dopo si assegna alla variabile pluto lo stesso contenuto della variabile pippo. Benché non sia strettamente necessario é bene attribuire la dichiarazione della variabile con var pippo; quello che stupisce é che non abbiamo una dichiarazione sul tipo di dati, le variabili in JS possono contenere qualsiasi tipo di dato e anche tipi diversi per esempio é corretto scrivere var pippo; pippo =3;pippo= “stringa testo”; esistono anche forme d compatte per scrivere tipo pippo = pippo * 2; che é anche uguale a pippo*=2; un altra operazione molto comune, ricorda web developer Umbria alias Faraoni Enrico ceo di Umbriaway Consulting, é l’incremento di una unità e il decremento dell’ unità, per questi due casi si usano rispettivamente gli operatori ++ e –: pippo–; pippo++; che equivalgono a pippo=pippo-1; e pippo = pippo +1; bisogna prestare attenzione alle forme compatte di somma e sottrazione nel caso esse vengano usate in espressioni, si consideri il seguente caso dove a=1; e b=1+ e a++; quanto valgono le variabili a e b al termine delle due istruzioni? Facendo una verifica possiamo dire che valgono 2, la seconda istruzione ha fatto prima la somma tra 1 e il valore precedente di a, poi é stata incrementata di 1. Per questa caratteristica le operazioni a ++ e a– si chiamano rispettivamente post incremento e post decremento (perché l’operazione viene effettuata dopo l’uso del valore contenuto nella variabie se questa é usata in espressioni). In maniera analoga esistono le operazioni di pre-incremento (++a) e pre-decremento (–a) eccco allora che scriveremo a=1; b = 1+ ++a; si può verificare che a vale sempre 2 mentre b ora vale 3. Occorre fare attenzione quando si utilizzano gli operatori di pre o post incremento in espressioni booleane complesse, si consideri per esempio questo caso dove a=0; var b=0; var bool1=a++>0 || b++>0); var bool2 =(a++<0 && b++<0); si provi a calcolare, al termine delle istruzioni i valori di a, b, bool1 e bool2. Dopo avere dato una risposta confrontate il risultato con la soluzione ossia a=2; b=1; bool=false; bool2=false; nel primo caso bool1 l’interprete valuta la prim espressione a++>0. Per farlo il valore il valore attuale di a (che é 0) viene valutato e poi confrontato, il confronto dà come risultato FALSE e poi si é incrementato di 1. Visto che c’è un OR logico la prima parte é stata valutata FALSE, l’interprete valuta anche la seconda parteper decidere il valore complessivo dell’ espressione. Lo fa in maniera analoga alla prima parte, per cui il risultato complessivo é FALSE e anche b viene incrementato di 1. A questo punto si valuta bool2. La prima espressione é a++<0; siccome a vale 1, a viene valutato FALSE e poi incrementato di 1. Però questa espressione fa si che l’intera espressione, essendoci AND sarà valutata a FALSE; pertanto la seconda espressione non viene valutata e il risultato per bool2 é FALSE, mentre ora a vale 2 e b resta con il valore 1. Ma che regole di conversione usa JS sul tipo di dati, come valuta una espressione del tipo: alert(“32/3/1.1*3*1.1=” + 32/3/1.1*3*1.1); a che tipo di risultato andiamo incontro? Serve Nostradamus per decodificare questa centuria? Il fatto é che JS ha le sue regole di conversione e l’operatore + nel caso di cui sopra ha una doppia funzione addiziona anche le stringhe oltre che fare calcoli. In pratica trasforma il numero in stringa e poi esegue la concatenazione, ribadisce web developer Umbria. Ma che dire di alert (3+2+”=3+2″); e alert (“3+2=”+3+2); a prima vista il tutto sembra equivalente o quasi ma provando si riscontra che le istruzioni non sono uguali affatto dove nel primo caso ottengo un alert con su scritto 5=3+2 e nel secondo ottengo 3+2 = 32. Per rendere i due script equivalenti é necessario far si che l’ordine delle operazioni, nei due casi sia uguale e per farlo si possono introdurre le parentesi visto che gli operatori + hanno diversi utilizzo di precedenza a seconda del contesto in cui si trovano. sostanzialmente ci sono diverse regole di precedenza su + e * per cui prima vengono risolti i * poi il +, del resto anche a scuola ci dicevano prima esegui le moltiplicazioni e le divisioni poi la somma. In Javascript per trasformare la stringa in un numero si può usare la funzione parseInt() per ottenere un numero intero oppure parseFloat() per ottenre un numero con la virgola. Si faccia attenzione perché il parser su una stringa che non é un numero fa restituire NaN valore particolare che indica “Not a Number” ovvero “non é un numero”.Nel caso che la stringa abbia un numero come prima parte, e poi una qualsiasi stringa, restituisce comunque il valore di tale numero. Per esempio tutte le espressioni tipo parseInt(’12’) o parseInt (’12pippo’) o parseInt (’12 12 12′) restituiscono tutte il valore 12; parseInt ha un secondo parametro opzionale che rappresenta la base da usare nel parsing del numero. Tale base può essere un numero da 2 a 36. Ecco ad esempio come eseguire il parser di una stringa in base 16 con risultato consequenziale che é 12: parseInt (‘c’, 16) e parseInt (‘0x0c’,16). Conviene anche esercitarsi con javascript e le basi diverse da dieci ma sul training ci sarà modo di vedere qualcosa di inerente con web developer Umbria!

Come posso valutare una espressione stringa?

formazione-umbriaAlcune volte le espressioni sono contenute all’ interno di una stringa, come quando si consente all’ utente di immettere una espressione in un campo di una form. Usando la funzione eval() potete istruire JS a valutare la stringa come una espressione. Per esempio se una variabile stringa di nome str1 é stata ssegnata una espressione come 128 + 62 visualizzando il valore di questa variabile avreste “128 + 62”. Invece visualizzando eval (str1) l’espressione verrebeb valutata visualizzando il valore 190. Formazione Nocera Umbra suggerisce di utilizzare la funzione eval() per valutare comandi JS in modo indiretto. Quando si effettua una chiamata alla funzione eval() l’interprete JS cerca di valutare qualsiasi stringa gli gli venga passata; potete salvare una istruzione JS come una stringa e valutarla usando la funzione eval().

<html>
<head>
</head>
<body>

hoursPerYear = “365 * 24”;
document.write(“To compute the number of hours in a year, you can use this expression: ” + hoursPerYear + “
“);
document.write(“The result of this expression is: ” + eval(hoursPerYear));

</body>
</html>

Crea un sito o un blog gratuitamente presso WordPress.com.

Su ↑