Parcours
/
JavaScript
JavaScript
/
Exercices
/
Chatbot à expressions régulières
Chatbot à expressions régulières

Chatbot à expressions régulières

Exercice d'apprentissage

Introduction

Les expressions régulières en JavaScript

Une expression régulière (ou regex) est une suite de caractères que l'on peut utiliser pour cibler et manipuler certains éléments dans des strings. On peut donc :

  • Rechercher un texte dans une string
  • Remplacer des sous-chaînes dans une string
  • Extraire des informations d'une string

💡 La syntaxe des expressions régulières de JavaScript fait partie de la norme ECMA-262 pour le langage. Cela signifie que tu n'as pas à te soucier de la compatibilité propre à chaque navigateur.

Comment créer des expressions régulières

En JavaScript, une expression régulière s'écrit le plus souvent sous la forme /pattern/modifiers.

On peut créer une expression régulière de deux façons :

  1. Littéral d'expression régulière :
const regex = /[a-z]/;
  1. Constructeur RegExp :
const regex = new RegExp('[a-z]');

Dans les deux cas, JavaScript crée un objet à partir de l'expression régulière. Il est recommandé d'utiliser des motifs immuables avec le littéral par défaut.

Le constructeur RegExp peut être utilisé dans les cas où l'expression régulière va changer ou n'est pas encore connue (comme une saisie).

🏴‍☠️ Drapeaux

Les expressions régulières ont des superpouvoirs optionnels appelés flags qui permettent des fonctionnalités supplémentaires.

Voici quelques-uns des plus couramment utilisés :

  • /g - Recherche globale
  • /i - Insensible à la casse
  • /m - Recherche multiligne

Voici un exemple simple :

const re = /home/gi;
const str = 'Home, sweet home.';
const myArray = str.match(re);
console.log(myArray);

=> // ["Home", "home"]

Le caractère g permet de trouver toutes les correspondances possibles dans une string. Sans cette fonctionnalité, JavaScript n'aurait extrait que la première correspondance Home.

Le drapeau d'insensibilité à la casse /i permet d'être flexible lorsqu'il s'agit de trouver un motif. Ainsi, peu importe si ce que l'on recherche est en UPPERCASE ou en lowercase.

Lorsque l'on utilise le constructeur RegExp, la syntaxe pour ajouter des drapeaux est différente.

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)

Les fonctions les plus courantes

Lorsque l'on combine les expressions régulières avec les fonctions natives actuelles de JavaScript, on dispose de moyens puissants pour manipuler et extraire des données à partir de strings.

Voici quelques-unes des fonctions les plus courantes utilisées avec les expressions régulières.

Test

La méthode test() exécute une recherche de correspondance entre une expression régulière et une string spécifiée. Renvoie vrai ou faux.

const str = 'It is difficult to test if you have a virus';
const result = /virus$/.test(str);

console.log(result);

// => true

Correspondance

Avec la méthode match(), on obtient un tableau utile dont le contenu dépend de la présence ou de l'absence des correspondances trouvées.

Ainsi, on peut à la fois rechercher et extraire des informations de n'importe quelle string. Par exemple :

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

Lorsque le drapeau de recherche globale /g est présent, au lieu d'obtenir seulement la correspondance avec des informations utiles comme l'indice ou l'entrée, la méthode renvoie toutes les occurrences affichées dans le tableau :

const funnyQuote =
  'If you see someone crying, ask if it is because of their haircut.';

const regex3 = /if/gi;

funnyQuote.match(regex3);
// => ["If", "if"];

Remplace

La méthode replace() en JavaScript permet de rechercher une valeur dans une string donnée et de la remplacer par une nouvelle valeur souhaitée.

string.replace(searchValue, newValue);

Le motif de recherche de la substitution peut être une simple string ou une expression régulière.

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');

De plus, on peut appliquer une fonction sur la position de remplacement afin d'apporter des modifications supplémentaires à chaque valeur.

let text = 'Say hello to the chatbot.';
let result = text.replace(/chatbot|hello/gi, function (word) {
  return word.toUpperCase();
});
// => "Say HELLO to the CHATBOT"

Découpe

La méthode split() en JavaScript représente une autre façon d'utiliser et de manipuler des strings avec des expressions régulières.

Ainsi, on utilise une expression régulière pour diviser une string donnée en reconnaissant un motif, par exemple str.split(/[,.\s]/). Ce motif sera utilisé comme separator.

const str = 'hello,user.how are.you';

const result = str.split(/[,.\s]/);

console.log(result);
// => ['hello', 'user', 'how', 'are', 'you']

Instructions

Tu as été recruté comme spécialiste des expressions régulières dans une entreprise qui développe un Chatbot.

Le projet n'en est qu'à une phase très basique de son développement, aussi ta mission consiste-t-elle à utiliser les expressions régulières pour améliorer la capacité du chatbot à comprendre et à générer du langage naturel.

Vérifie une commande valide

En plus d'être intelligent, le Chatbot est aussi un assistant fidèle.

Pour poser une question au chatbot, l'utilisateur doit dire le mot « Chatbot » en première position de la commande.

Peu importe que le mot-clé soit en majuscules ou en minuscules. Ce qui compte ici, c'est la position du mot.

Implémente la fonction isValidCommand() qui aide le Chatbot à reconnaître le moment où l'utilisateur donne une commande.

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

Supprime les emojis chiffrés

Le Chatbot a du mal à comprendre comment les humains utilisent les emojis pour exprimer leurs émotions.

Quand le chatbot reçoit des messages d'utilisateurs, chaque emoji est représenté par « emoji » suivi de son numéro id.

Implémente la méthode removeEmoji() qui prend une string et supprime tout le chiffrement des emojis dans le message.

Les lignes qui ne contiennent pas de texte d'emoji doivent être renvoyées sans modification.

Supprime simplement le texte de l'emoji. N'essaie pas d'ajuster les espaces.

Pour ce défi en particulier, utilise la syntaxe de constructeur pour créer l'expression régulière.

removeEmoji("I love playing videogames emoji3465 it's one of my hobbies");
// => "I love playing videogames  it's one of my hobbies"

Vérifie un numéro de téléphone valide

Comme les fonctionnalités du chatbot se téléchargent sur une application mobile, l'utilisateur est amené à saisir un numéro de téléphone pendant la conversation.

Le problème, c'est que le chatbot ne peut lire et valider qu'un numéro au format spécifique.

Si le numéro est valide (s'il correspond à la séquence de caractères spécifiée par l'expression régulière), le chatbot répond par un message qui remercie l'utilisateur et confirme le numéro. Si le numéro n'est pas valide, la fonction informe l'utilisateur que le numéro de téléphone n'est pas valide.

Le format attendu est : (+##) ###-###-###

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"

Récupère le lien d'un site web

Le Chatbot est un logiciel vraiment curieux. Même s'il peut faire des recherches sur internet à propos d'un sujet précis, il aime demander aux utilisateurs des sites web sympas ou des URL pour aller trouver des informations pertinentes.

Exemple de conversation :

  • Chatbot : Salut username, j'aimerais apprendre à coder en JavaScript, tu connais un site web sympa où je pourrais apprendre ?
  • Utilisateur : J'ai beaucoup appris sur exercism.org

Implémente la fonction getURL() capable de renvoyer un tableau contenant uniquement le lien de chaque site web. Écrire une regex capable de reconnaître n'importe quelle URL serait très compliqué, mais le Chatbot n'a besoin de lire que des URL simples. Pour cet exercice, une URL est toute suite de mots délimitée par des ".".

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

Salue l'utilisateur

Pour stocker les données de toutes les personnes avec qui il a discuté, le chatbot est capable de récupérer le nom complet depuis le profil de l'utilisateur, sous cette forme : « smith, john ».

De cette façon, on veut que notre chatbot soit vraiment poli et fasse bonne impression.

Écris la fonction niceToMeetYou() qui prend une string contenant le nom complet de l'utilisateur et renvoie la string « Nice to meet you, John Smith »

Dans un but pédagogique, implémente la fonction en utilisant une méthode de remplacement des expressions régulières.

let str = 'Smith, John';

niceToMeetYou(str);
// => "Nice to meet you, John Smith"
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
JavaScript Exercism

Prêt à commencer Chatbot à expressions régulières ?

Inscris-toi sur Exercism pour apprendre et maîtriser JavaScript avec 37 concepts159 exercices, et un vrai mentorat humain, le tout gratuitement.