Capítulo 14
Expresión regular
Una expresión regular es un objeto que puede construirse con el constructor RegEx
o escribirse como un valor literal encerrando un patrón entre una barra diagonal (/)
. Las sintaxis para crear una expresión regular se muestran a continuación.
// usando el cosntructor de expresión regular
new RegExp(patron[, banderas]);
// usando literales
/patron/modificadores
Las banderas son opcionales al crear una expresión regular usando literales. Un ejemplo de creación de un regular idéntico utilizando el método mencionado anteriormente es el siguiente.
let re1 = new RegExp("xyz");
let re2 = /xyz/;
Ambas formas crearán un objeto regex y tendrán los mismos métodos y propiedades. Hay casos en los que podríamos necesitar valores dinámicos para crear una expresión regular; en ese caso, los literales no funcionarán y tendrán que ir con el constructor.
En los casos en los que queremos que una barra diagonal sea parte de una expresión regular, tenemos que escapar de la barra diagonal (/)
con una barra invertida (\)
.
Los diferentes modificadores que se utilizan para realizar búsquedas que no distinguen entre mayúsculas y minúsculas son:
g
- búsqueda global (encuentra todas las coincidencias en lugar de detenerse después de la primera)
Ejemplo :
const str = "Hello world, hello again!";
const regex = /hello/g;
const matches = str.match(regex);
// Si estás pensando en .match() lee esto 👇
// Es un método integrado en JavaScript que se utiliza para buscar una cadena que coincida con una expresión.
// Si se encuentra la coincidencia, devuelve una matriz de todas las coincidencias que se encontraron. Si no, el método .match() devuelve nulo.
console.log(matches); // ["Hello", "hello"]
i
- búsqueda que no distingue entre mayúsculas y minúsculas
Ejemplo :
const str = "HeLlO WoRlD";
const regex = /hello/i;
const match = regex.test(str);
// El método '.test()' devuelve un valor booleano:
// 'true' si se encuentra una coincidencia, y 'false' si la coincidencia no se encuentra.
console.log(match); // true
m
- coincidencia multilínea
Ejemplo :
const str = "This is a\nmultiline string.";
const regex = /./mg;
const matches = str.match(regex);
// La bandera m se utiliza para hacer coincidir caracteres de nueva línea (\n).
// Esto significa que la expresión regular coincidirá con los 26 caracteres de la cadena.
// incluyendo el carácter de nueva línea.
console.log(matches.length); // 26
Los corchetes se utilizan en una expresión regular para encontrar un rango de caracteres. Algunos de ellos se mencionan a continuación.
[abc]
- Encuentra cualquier carácter entre corchetes.
Ejemplo :
const str = "The cat and the dog are both animals.";
const regex = /[abc]/g;
const matches = str.match(regex);
console.log(matches); // Matriz de todas las ocurrencias de a, b, y c
[
'c', 'a', 'a',
'a', 'b', 'a',
'a'
]
[^abc]
- encontrar cualquier carácter, menos los que están entre corchetes
Ejemplo :
const str = "The cat and dog.";
const regex = /[^abc]/g; // Coincide cualquier carácter que no sea 'a', 'b', o 'c'
const matches = str.match(regex);
console.log(matches); // Matriz de todas las ocurrencias de caracteres que no sean 'a', 'b', o 'c'
[
'T', 'h', 'e', ' ',
't', ' ', 'n', 'd',
' ', 'd', 'o', 'g',
'.'
]
[0-9]
- encuentra cualquier dígito de los que están entre corchetes
Ejemplo :
const str = "The price of the item is $25, but it may change to $30.";
const regex = /[0-9]/g; // Coincide con cualquier dígito desde el 0 al 9
const matches = str.match(regex);
console.log(matches); // Matriz con todas las ocurrencias de los dígitos
[
'2', '5', '3', '0'
]
[^0-9]
- encuantra cualquier dígito, menos los que estaán entre corchetes
Ejemplo :
const str = "The price is $25.";
const regex = /[^0-9]/g; // Coincide con cualquier carácter que no sea un dígito
const matches = str.match(regex);
console.log(matches); // Matriz de todas las ocurrencias de números que no son dígitos
[
'T', 'h', 'e', ' ',
'p', 'r', 'i', 'c',
'e', ' ', 'i', 's',
' ', '$', '.'
]
(x|y)
- encuentre cualquiera de las alternativas separadas por |
Ejemplo :
const str = "The words 'xylophone' and 'yellow' contain the letters 'x' and 'y'.";
const regex = /(x|y)/g; // Coincide con 'x' o 'y'
const matches = str.match(regex);
console.log(matches); // Matriz de todas las apariciones de 'x' o 'y'
[
'x', 'y', 'y', 'x', 'x', 'y'
]
Los metacaracteres son caracteres especiales que tienen un significado especial en la expresión regular. Estos caracteres se describen con más detalle a continuación:
Metacaracter | Descripción |
---|---|
. |
Coincide con un solo carácter excepto nueva línea o un terminador |
\w |
Coincide con un carácter de palabra (carácter alfanumérico [a-zA-Z0–9_] ) |
\W |
Coincide con un carácter que no es una palabra (igual que [^a-zA-Z0–9_] ) |
\d |
Coincide con cualquier carácter de dígito (igual que [0-9] ) |
\D |
Coincide con cualquier carácter que no sea un dígito |
\s |
Coincide con un carácter de espacio en blanco (espacios, tabulaciones, etc.) |
\S |
Coincide con un carácter que no sea un espacio en blanco |
\b |
Coincidencia al principio/final de una palabra |
\B |
Coincide pero no al principio/final de una palabra |
\0 |
Coincide con un carácter NULL |
\n |
Coincide con un carácter de nueva línea |
\f |
Coincide con un carácter de avance de formulario |
\r |
Coincide con un carácter de retorno de carro |
\t |
Coincide con un carácter de tabulación |
\v |
Coincide un carácter de tabulación vertical |
\xxx |
Coincide con un carácter especificado por un número octal xxx |
\xdd |
Coincide con un carácter especificado por un número hexadecimal dd |
\udddd |
Coincide con un carácter especificado por un número hexadecimal dddd |
Las propiedades y métodos admitidos por RegEx se enumeran a continuación.
Nombre | Descripción |
---|---|
constructor |
Devuelve la función que creó el prototipo del objeto RegEx |
exec() |
Prueba la coincidencia y devuelve la primera coincidencia; si no hay coincidencia, devuelve null |
global |
Comprueba si el modificador g está configurado |
ignoreCase |
Comprueba si el modificador i está configurado |
lastIndex |
Especifica el índice en el que comenzar la próxima coincidencia. |
multiline |
Comprueba si el modificador m está configurado |
source |
Devuelve el texto de la cadena. |
test() |
Prueba la coincidencia y devuelve true o false |
toString() |
Devuelve el valor de cadena de la expresión regular. |
Un método compile()
compila la expresión regular y está en desuso.
Un ejemplo común de expresión regular
let texto = "Las mejores cosas de la vida son gratis";
let resultado = /e/.exec(texto); // busca una coincidencia de e en una cadena
// resultado: e
let textoHolaMundo = "¡Hola mundo!";
// Busca "Hola"
let pattern1 = /Hola/g;
let result1 = pattern1.test(textoHolaMundo);
// result1: true
let pattern1String = pattern1.toString();
// pattern1String : '/Hola/g'
Un ejemplo real de expresiones regulares en la verificación de códigos PIN
const handleSubmit = (e) => {
// Evitar el comportamiento de envío de formulario predeterminado
e.preventDefault();
// Definir una lista de códigos PIN válidos
const validPincodes = [
110001, 110002, 110003, 110004, 110005, 110006, 110007, 110008, 110009,
110010, 110011, 110012, 110013, 110014, 110015, 110016, 110017, 110018,
110019, 110020, 110021, 110022, 110023, 110050, 110051, 110056, 110048,
110057, 110058, 110059, 110060, 110061, 110062, 110063, 110064
];
// Convertir los códigos PIN válidos en cadenas
const validPincodeStrings = validPincodes.map((pincode) => String(pincode));
// Crea un patrón de expresión regular para que coincida con códigos PIN válidos
const regexPattern = new RegExp(`^(${validPincodeStrings.join("|")})$`);
// Obtiene el código PIN enviado desde el campo de entrada
const submittedPincode = pincode; // Asegúrese de que el 'pincode' esté definido en otra parte
// Comprueba si el código PIN enviado coincide con el patrón de código PIN válido
if (regexPattern.test(submittedPincode)) {
// Muestra un mensaje de éxito
// ...
} else if (submittedPincode === "") {
// Muestra un mensaje de error para una entrada vacía
// ...
} else if (submittedPincode.length < 6) {
// Muestra un mensaje de error para una longitud de código PIN no válida
// ...
}
}