Un'espressione regolare (o regex) è una sequenza di caratteri che possiamo usare per individuare e manipolare determinati elementi all'interno di una stringa. Possiamo quindi:
💡 Il flavor delle regex di JavaScript fa parte dello standard ECMA-262 per il linguaggio. Questo significa che non devi preoccuparti della compatibilità specifica dei vari browser.
In JavaScript, un'espressione regolare si scrive per lo più nel formato /pattern/modifiers.
Esistono due modi per creare un'espressione regolare:
const regex = /[a-z]/;
const regex = new RegExp('[a-z]');
In entrambi i casi, JavaScript crea un oggetto a partire dalla regex. Si consiglia di usare pattern immutabili, preferendo il letterale come impostazione predefinita.
Il costruttore RegExp può essere usato nei casi in cui la regex cambierà o non la conosciamo ancora (come un input).
Le espressioni regolari hanno dei superpoteri opzionali chiamati flags che consentono funzionalità aggiuntive.
Alcuni dei più usati sono:
/g: Ricerca globale/i: Senza distinzione tra maiuscole e minuscole/m: Ricerca multilineaEcco un semplice esempio:
const re = /home/gi;
const str = 'Home, sweet home.';
const myArray = str.match(re);
console.log(myArray);
=> // ["Home", "home"]
Il carattere g ci permette di individuare tutte le possibili corrispondenze all'interno di una stringa. Senza questa funzionalità, JavaScript avrebbe estratto solo la prima corrispondenza di Home.
Il flag /i per ignorare maiuscole e minuscole ci rende più flessibili nella ricerca di un pattern. Così non importa se quello che stiamo cercando è scritto in UPPERCASE o lowercase.
Quando si usa il costruttore RegExp, la sintassi per aggiungere i flag è diversa.
let regex = /[a-z]/gi; // literal notation
let regex = new RegExp('[a-z]', 'gi'); // constructor with string pattern as first argument
let regex = new RegExp(/[a-z]/, 'gi'); // constructor with regular expression literal as first argument (Starting with ECMAScript 6)
Quando le espressioni regolari si combinano con le funzioni native di JavaScript, abbiamo a disposizione modi potenti per manipolare le stringhe ed estrarne i dati.
Queste sono alcune delle funzioni più comuni usate insieme alle regex.
Il metodo test() esegue una ricerca per trovare una corrispondenza tra un'espressione regolare e una stringa specificata. Restituisce true o false.
const str = 'It is difficult to test if you have a virus';
const result = /virus$/.test(str);
console.log(result);
// => true
Con il metodo match(), otteniamo un array utile il cui contenuto dipende dalla presenza o dall'assenza delle corrispondenze trovate.
In questo modo, siamo in grado sia di cercare che di estrarre informazioni da qualsiasi stringa. Ad esempio:
const funnyQuote =
'If you see someone crying, ask if it is because of their haircut.';
const regex1 = /someone/;
const regex2 = /happy/;
funnyQuote.match(regex1);
// => ["someone", index: 11, input: "If you see someone crying, ask if it is because of their haircut.", groups: undefined]
funnyQuote.match(regex2);
// => null
Quando è presente il flag di ricerca globale /g, invece di ottenere solo la corrispondenza insieme a informazioni utili come l'indice o l'input, il metodo restituisce tutte le occorrenze presenti nell'array:
const funnyQuote =
'If you see someone crying, ask if it is because of their haircut.';
const regex3 = /if/gi;
funnyQuote.match(regex3);
// => ["If", "if"];
Il metodo replace() di JavaScript ci permette di cercare un valore all'interno di una determinata stringa e di sostituirlo con un nuovo valore desiderato.
string.replace(searchValue, newValue);
Il pattern con cui cercare la sostituzione può essere una singola stringa o un'espressione regolare.
let string = 'I like dogs!';
let result = string.replace('dogs', 'cats');
let string = 'I would love to travel to Japan';
let result = string.replace(/Japan/g, 'Hawaii');
Inoltre, possiamo applicare una funzione nella posizione di sostituzione per apportare ulteriori modifiche a ciascun valore.
let text = 'Say hello to the chatbot.';
let result = text.replace(/chatbot|hello/gi, function (word) {
return word.toUpperCase();
});
// => "Say HELLO to the CHATBOT"
Il metodo split() di JavaScript rappresenta un modo diverso di usare e manipolare le stringhe con le espressioni regolari.
In questo modo, useremo le regex per dividere una determinata stringa riconoscendo un pattern, ad esempio str.split(/[,.\s]/). Questo pattern verrà usato come separator.
const str = 'hello,user.how are.you';
const result = str.split(/[,.\s]/);
console.log(result);
// => ['hello', 'user', 'how', 'are', 'you']
Ti hanno assunto come specialista di espressioni regolari in un'azienda che sta sviluppando un Chatbot.
Il progetto è in una fase di sviluppo molto iniziale, quindi la tua missione è usare le espressioni regolari per migliorare la capacità del chatbot di capire e generare linguaggio naturale.
Oltre a essere intelligente, il Chatbot è anche un assistente leale.
Per chiedere qualcosa al chatbot, l'utente deve dire la parola «Chatbot» come prima cosa del comando.
Non importa se la parola chiave è in MAIUSCOLO o in minuscolo. L'aspetto importante qui è la posizione della parola.
Implementa la funzione isValidCommand() che aiuta il Chatbot a riconoscere quando l'utente sta impartendo un comando.
isValidCommand("Chatbot, play a song from the 80's.";
// => True
isValidCommand("Hey Chatbot, where is the closest pharmacy?";
// => False
isValidCommand("CHATBOT, do you have a solution for this challenge?";
// => True
Il Chatbot fa fatica a capire come gli esseri umani usano le emoji per esprimere le proprie emozioni.
Quando il chatbot riceve i messaggi degli utenti, ogni emoji è rappresentata come «emoji» seguita dal suo numero id.
Implementa il metodo removeEmoji() in modo che prenda una stringa e rimuova la codifica di tutte le emoji presenti nel messaggio.
Le righe che non contengono il testo delle emoji devono essere restituite senza modifiche.
Rimuovi solo la stringa dell'emoji. Non cercare di sistemare gli spazi bianchi.
Per questa sfida in particolare, usa la sintassi del costruttore per creare l'espressione regolare.
removeEmoji("I love playing videogames emoji3465 it's one of my hobbies");
// => "I love playing videogames it's one of my hobbies"
Dato che le funzionalità del chatbot si scaricano su un'app mobile, ci si aspetta che l'utente scriva un numero di telefono durante la conversazione.
Il problema è che il chatbot sa leggere e validare solo un numero con un formato specifico.
Se il numero è valido (corrisponde alla sequenza di caratteri specificata dall'espressione regolare), il chatbot risponde con un messaggio che ringrazia l'utente e conferma il numero. Se il numero non è valido, la funzione informa l'utente che il numero di telefono non è valido.
Il formato atteso è: (+##) ###-###-###
checkPhoneNumber('(+34) 659-771-594');
// => "Thanks! You can now download me to your phone."
checkPhoneNumber('659-771-594');
// => "Oops, it seems like I can't reach out to 659-771-594"
Il Chatbot è un software davvero curioso. Anche se può cercare su internet informazioni su un argomento specifico, gli piace chiedere agli utenti siti web interessanti o URL da cui andare a trovare le informazioni che servono.
Esempio di conversazione:
Implementa la funzione getURL() che riesce a restituire un array con solo il link di ciascun sito web. Scrivere una regex in grado di riconoscere qualsiasi URL sarebbe molto complicato, ma al Chatbot basta leggere URL semplici. Per questo esercizio, un URL è una qualsiasi sequenza di parole separate da ".".
getURL(
'I learned a lot from exercism.org and developer.mozilla.org, but I found ts39.es very boring!',
);
// => ["exercism.org", "developer.mozilla.org", "ts39.es"];
Per memorizzare i dati di tutte le persone con cui ha conversato, il chatbot riesce a ricavare il nome completo dal profilo dell'utente in questo formato: «smith, john».
In questo modo, vogliamo che il nostro chatbot sia davvero educato e faccia una buona impressione.
Scrivi la funzione niceToMeetYou() che prende una stringa con il nome completo dell'utente e restituisce la stringa «Nice to meet you, John Smith»
A scopo di apprendimento, implementa la funzione usando un metodo di sostituzione delle espressioni regolari.
let str = 'Smith, John';
niceToMeetYou(str);
// => "Nice to meet you, John Smith"
Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.