Track
/
JavaScript
JavaScript
/
Esercizi
/
Chatbot a espressioni regolari
Chatbot a espressioni regolari

Chatbot a espressioni regolari

Esercizio di apprendimento

Introduzione

Espressioni regolari in JavaScript

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:

  • Cercare un testo in una stringa
  • Sostituire sottostringhe in una stringa
  • Estrarre informazioni da una stringa

💡 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.

Come creare le espressioni regolari

In JavaScript, un'espressione regolare si scrive per lo più nel formato /pattern/modifiers.

Esistono due modi per creare un'espressione regolare:

  1. Letterale di espressione regolare:
const regex = /[a-z]/;
  1. Costruttore RegExp:
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).

🏴‍☠️ Flag

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 multilinea

Ecco 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)

Le funzioni più comuni

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.

Test

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

Match

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"];

Replace

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"

Split

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']

Istruzioni

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.

Controlla che il comando sia valido

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

Rimuovi le emoji criptate

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"

Controlla che il numero di telefono sia valido

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:

  • Chatbot: Ciao username, vorrei imparare a programmare in JavaScript, conosci qualche sito interessante dove potrei imparare?
  • Utente: Ho imparato molto da exercism.org

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"];

Saluta l'utente

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"
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
JavaScript Exercism

Vuoi iniziare Chatbot a espressioni regolari?

Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.