Rutas
/
JavaScript
JavaScript
/
Ejercicios
/
Chatbot de expresiones regulares
Chatbot de expresiones regulares

Chatbot de expresiones regulares

Ejercicio de aprendizaje

Introducción

Expresiones regulares en JavaScript

Una expresión regular (o regex) es una secuencia de caracteres que podemos usar para seleccionar y manipular ciertos elementos dentro de un string. Por lo tanto, podemos:

  • Buscar un texto en un string
  • Reemplazar fragmentos de un string
  • Extraer información de un string

💡 La variante de expresiones regulares de JavaScript forma parte del estándar ECMA-262 del lenguaje. Esto significa que no tienes que preocuparte por la compatibilidad específica de cada navegador.

Cómo crear expresiones regulares

En JavaScript, una expresión regular se escribe normalmente con el formato /pattern/modifiers.

Tenemos dos formas de crear una expresión regular:

  1. Literal de expresión regular:
const regex = /[a-z]/;
  1. Constructor RegExp:
const regex = new RegExp('[a-z]');

En ambos casos, JavaScript crea un objeto a partir de la expresión regular. Se recomienda usar patrones inmutables con el literal de forma predeterminada.

El constructor RegExp se puede usar en los casos en los que la expresión regular vaya a cambiar o todavía no la conozcamos (como una entrada).

🏴‍☠️ Flags

Las expresiones regulares tienen superpoderes opcionales llamados flags que permiten funcionalidades adicionales.

Algunas de las más usadas son:

  • /g - Búsqueda global
  • /i - Insensible a mayúsculas y minúsculas
  • /m - Búsqueda multilínea

Aquí tienes un ejemplo sencillo:

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

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

El carácter g nos permite analizar todas las coincidencias posibles dentro de un string. Sin esta funcionalidad, JavaScript solo habría extraído la primera coincidencia de Home.

La flag de insensibilidad a mayúsculas y minúsculas /i nos permite ser flexibles a la hora de encontrar un patrón. De este modo, da igual si lo que buscamos está en UPPERCASE o en lowercase.

Cuando usamos el constructor RegExp, la sintaxis para añadir flags es diferente.

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)

Funciones más comunes

Cuando combinamos las expresiones regulares con las funciones integradas actuales de JavaScript, tenemos formas muy potentes de manipular y obtener datos de los strings.

Estas son algunas de las funciones más comunes que se usan junto con las expresiones regulares.

Test

El método test() ejecuta una búsqueda de coincidencia entre una expresión regular y un string especificado. Devuelve 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 el método match(), obtenemos un array útil cuyo contenido depende de la presencia o ausencia de las coincidencias encontradas.

De este modo, podemos tanto buscar como extraer información de cualquier string. Por ejemplo:

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

Cuando está presente la flag de búsqueda global /g, en lugar de obtener la única coincidencia junto con información útil como el índice o la entrada, el método devuelve todas las apariciones mostradas en el 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

El método replace() de JavaScript nos permite buscar un valor dentro de un string dado y reemplazarlo por un nuevo valor deseado.

string.replace(searchValue, newValue);

El patrón con el que se busca la sustitución puede ser un único string o una expresión regular.

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

Además, podemos aplicar una función en la posición de reemplazo para hacer cambios adicionales en cada valor.

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

El método split() de JavaScript representa otra forma de usar y manipular strings con expresiones regulares.

De este modo, usaremos la expresión regular para dividir un string dado reconociendo un patrón, por ejemplo, str.split(/[,.\s]/). Este patrón se usará como separator.

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

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

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

Instrucciones

Te han contratado como especialista en expresiones regulares en una empresa que está desarrollando un Chatbot.

Está en una fase de desarrollo muy básica, así que tu misión es usar expresiones regulares para mejorar la capacidad del chatbot de entender y generar lenguaje natural.

Comprobar un comando válido

Además de ser inteligente, el Chatbot también es un asistente leal.

Para preguntarle algo al chatbot, el usuario debe decir la palabra «Chatbot» en la primera posición del comando.

No importa si la palabra clave está en MAYÚSCULAS o en minúsculas. Lo importante aquí es la posición de la palabra.

Implementa la función isValidCommand() que ayuda al Chatbot a reconocer cuándo el usuario está dando 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

Eliminar emojis cifrados

Al Chatbot le cuesta entender cómo los humanos usan los emojis para expresar sus emociones.

Cuando el chatbot recibe mensajes de usuario, cada emoji se representa como emoji seguido de su número id.

Implementa el método removeEmoji() para que tome un string y elimine todo el cifrado de emojis a lo largo del mensaje.

Las líneas que no contengan texto de emojis deben devolverse sin modificar.

Elimina solo el string del emoji. No intentes ajustar los espacios en blanco.

Para este reto en concreto, usa la sintaxis de constructor para crear la expresión regular.

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

Comprobar un número de teléfono válido

Dado que las funcionalidades del chatbot se pueden descargar en una aplicación móvil, se espera que el usuario escriba un número de teléfono durante la conversación.

El problema es que el chatbot solo puede leer y validar un número con un formato específico.

Si el número es válido (coincide con la secuencia de caracteres especificada por la expresión regular), el chatbot responde con un mensaje que agradece al usuario y confirma el número. Si el número no es válido, la función informa al usuario de que el número de teléfono no es válido.

El formato esperado es: (+##) ###-###-###

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"

Obtener el enlace de una página web

El Chatbot es un software muy curioso. Aunque puede buscar en internet sobre un tema concreto, le gusta preguntar a los usuarios por páginas web o URL interesantes a las que acudir para encontrar información relevante.

Ejemplo de conversación:

  • Chatbot: Hola, username, me gustaría aprender a programar en JavaScript, ¿conoces alguna página web interesante donde pueda aprender?
  • User: Aprendí mucho en exercism.org

Implementa la función getURL() que es capaz de devolver un array con solo el enlace de cada página web. Escribir una regex para reconocer cualquier URL sería muy complicado, pero el Chatbot solo necesita leer URL simples. Para este ejercicio, una URL es cualquier secuencia de palabras delimitada por ".".

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

Saludar al usuario

Para almacenar los datos de todas las personas con las que ha conversado, el chatbot puede obtener el nombre completo del perfil del usuario con este estilo: "smith, john".

De esta forma, queremos que nuestro chatbot sea muy educado y cause una buena impresión.

Escribe la función niceToMeetYou() que toma un string con el nombre completo del usuario y devuelve el string "Nice to meet you, John Smith"

Con fines de aprendizaje, implementa la función usando un método de reemplazo de las expresiones regulares.

let str = 'Smith, John';

niceToMeetYou(str);
// => "Nice to meet you, John Smith"
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
JavaScript Exercism

¿Listo para empezar Chatbot de expresiones regulares?

Regístrate en Exercism para aprender y dominar JavaScript con 37 conceptos159 ejercicios y mentoría humana real, todo gratis.