Una expresión regular (o regex) es una secuencia de caracteres que podemos usar para apuntar a ciertos elementos dentro de los strings y manipularlos. Así, podemos:
💡 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.
En JavaScript, una expresión regular se escribe casi siempre con el formato /pattern/modifiers.
Tenemos dos formas de crear una expresión regular:
const regex = /[a-z]/;
const regex = new RegExp('[a-z]');
En ambos casos, JavaScript crea un objeto a partir de la regex. Se recomienda usar patrones inmutables y tomar el literal como opción predeterminada.
El constructor RegExp se puede usar en casos donde la regex cambiará o todavía no la conocemos (como una entrada).
Las expresiones regulares tienen superpoderes opcionales llamados flags que permiten funcionalidades adicionales.
Algunas de las más usadas son:
/g - Búsqueda global/i - Sin distinguir mayúsculas y minúsculas/m - Búsqueda multilíneaAquí hay 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 encontrar todas las coincidencias posibles dentro de un string. Sin esta funcionalidad, JavaScript solo habría extraído la primera coincidencia de Home.
La bandera /i de no distinguir mayúsculas y minúsculas nos da flexibilidad al buscar un patrón. Así, no importa si lo que buscamos está en UPPERCASE o en lowercase.
Cuando usamos el constructor RegExp, la sintaxis para agregar banderas 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)
Cuando combinamos las expresiones regulares con las funciones integradas 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 regex.
El método test() busca una coincidencia entre una expresión regular y un string determinado. 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
Con el método match() obtenemos un array útil cuyo contenido depende de si se encuentran coincidencias o no.
De esta forma, 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 bandera de búsqueda global /g, en lugar de obtener solo la coincidencia junto con información útil como el índice o la entrada, el método devuelve todas las apariciones 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"];
El método replace() de JavaScript nos permite buscar un valor dentro de un string determinado y reemplazarlo por el nuevo valor que queramos.
string.replace(searchValue, newValue);
El patrón para buscar la sustitución puede ser un solo 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"
El método split() de JavaScript representa otra forma de usar y manipular strings con expresiones regulares.
De esta forma, usaremos las regex para dividir un string determinado reconociendo un patrón, por ejemplo str.split(/[,.\s]/). Este patrón se usará como el separator.
const str = 'hello,user.how are.you';
const result = str.split(/[,.\s]/);
console.log(result);
// => ['hello', 'user', 'how', 'are', 'you']
Te contrataron 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.
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
El chatbot tiene dificultades para entender cómo las personas usan los emojis para expresar sus emociones.
Cuando el chatbot recibe mensajes del usuario, cada emoji se representa como «emoji» seguido de su número id.
Implementa el método removeEmoji() para que reciba un string y elimine todo el cifrado de los emojis a lo largo del mensaje.
Las líneas que no contengan el texto del emoji deben devolverse sin modificar.
Solo elimina el texto del emoji. No intentes ajustar los espacios en blanco.
Para este reto en particular, 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"
Debido a la descarga de funcionalidades del chatbot en una app 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 en el 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"
El chatbot es un software muy curioso. Aunque puede buscar en internet sobre un tema en particular, le gusta preguntar a los usuarios por sitios web interesantes o URLs donde encontrar información relevante.
Ejemplo de conversación:
Implementa la función getURL() que sea capaz de devolver un array con solo el enlace de cada sitio web. Escribir una regex para reconocer cualquier URL sería muy complicado, pero el chatbot solo necesita leer URLs 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"];
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 cortés y cause una buena impresión.
Escribe la función niceToMeetYou() que recibe 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"
Regístrate en Exercism para aprender y dominar JavaScript con 37 conceptos159 ejercicios y mentoría humana real, todo gratis.