Expresiones regulares
Trabajando con literales
Las expresiones regulares constituyen un mecanismo bastante potente para realizar manipulaciones de cadenas de texto. Es una herramienta procedente del mundo Unix y la base del lenguaje Perl.
Estos objetos son fundamentales para búsquedas y substituciones de literales dentro de cadenas de texto.
En principio estas operaciones puede hacerse usando los métodos del objeto string, pero el problema surge cuando no tenemos una subcadena fija y concreta sino que queremos buscar un texto que responda a un cierto esquema o modelo genérico, como por ejemplo: buscar aquellas palabras que comienzan con http: y finalizan con una \, o buscar palabras que contengan una serie de números consecutivos, etc.. O sea, búsquedas basadas en patrones mas que cadenas concretas.
Un ejemplo, que terminarás de comprender despues de leer estas páginas. Tenemos unas cuantas urls y quiero un script que determine las que son sitios seguro, comienzan con https:
var url1 = "https://example.com" ;
var url2 = "http://ejemplo.com"
var url3 = "ahttps://www.ejemplo.com"
var patron = new RegExp("^https:.$")
patron.test(url1); //true
patron.test(url2); //false
patron.test(url3); //false
El patrón se ha definido con el constructor RegExp y se ha comprobado contra las variables usadno el método patron.test( ).
Los patrones también se pueden construir mediante una expresión formada por los caracteres de las expresiones regulares encerrados entre dos barras inclinadas / /
Esos patrones están construídos con una serie de símbolos especiales (metacaracteres), y modificadores además de los caracteres normales usados por Javascript. Sirven para describir lo que se está buscando.
Los patrones de expresiones regulares también se usan en algunos métodos del objeto String.
Las listas de definiciones y descripciones aisladas suelen ser tediosas, pero a veces hay que usarlas. Pero para conocer como se usan los patrones sigue los ejemplos que aparecen en el lateral.
En la tabla que sigue se muestran los caracteres comodín usados para crear los patrones y su significado, junto a un pequeño ejmplo de su utilización.
Significado | Ejemplo | Resultado | |
\ | Carácter de escape | /\$ftp/ | Busca la palabra $ftp |
^ | Comienzo de línea | /^-/ | Líneas que comienzan por - |
$ | Final de línea | /s$/ | Líneas que terminan por s |
. | Cualquier carácter (menos salto de línea) | /\b.\b/ | Palabras de una sóla letra |
| | Indica opciones | /(L|l|f|)ocal/ | Busca Local, local, focal |
( ) | Grupo de caracteres | /(vocal)/ | Busca vocal |
[ ] | Caracteres opcionales | /escrib[aoe]/ | Vale escriba, escribo, escribe |
La tabla que sigue describe los modificadores que pueden usarse con los caracteres que forman el patrón. Cada modificador actúa sobre el carácter o grupos inmediatamente anterior.
Descripción | Ejemplo | Resultado | |
* | Repetir 0 o más veces | /A*234/ | Valen 234, A234, AA234... |
+ | Repetir 1 o más veces | /a*mar/ | Valen amar, aamar, aaamar... |
? | 1 o 0 veces | /a?mar/ | Valen amar, mar. |
{n} | Exactamente n veces | /p{2}sado/ | Vale ppsado |
{n,} | Al menos n veces | /(m){2}ala/ | Vale mmala, mmmala.... |
{m,n} | entre m y n veces | /tal{1,3}a/ | Vale tala, talla, tallla |
Los siguientes son caracteres especiales para indicar caracteres de texto no imprimibles, como puedan ser el fín de línea o un tabulador, o grupos predefinidos de caracteres (alfabéticos, numéricos, etc...). Si se usa el constructor RegExp las barras inclinadas \ deben ser escapadas, o sea escritas dobles: \d -> \\d. En la declaración literal no es necesasrio.
Significado | Ejemplos | Resultado | |
\b | Principio o final de palabra | /\bver\b/ | Vale "ver de", pero no "verde" |
\B | Frontera entre no-palabras | /\Bver\B/ | Vale "Valverde" pero no con "verde" |
\d | Un dígito | /[A-Z]\d/ | No falla en "A4", si en "4" |
\D | Alfabético (no dígito) | /[A-Z]\D/ | Fallaría en "A4" |
\O | Carácter nulo | ||
\t | (tabulador) | ||
\f | Salto de página | ||
\n | Salto de línea | ||
\w | Alfanumérico, |
/\w+/ | Encuentra AZ en "AZ%", sin %. |
\W | Opuesto a \w |
/\W/ | Hallaría sólo % en AZ% |
\s | Carácter tipo espacio | /\sSi\s/ | Encuentra Si en "Si Si " no en "SiSi" |
\S | Opuesto a \s | ||
\cX | Carácter de control X | \c9 | El tabulador |
\oNN | Carácter octal NN | ||
\xhh | El hexadecimal hh | /\x41/ | Encuentra la A (ASCII 41) en "letra A" |
Por último tenemos los flags o marcadores para modificar la forma de buscar. Se añaden al final de la expresión del patrón o como segundo argumento en el constructor RegExp.
flags | Acción |
d | genera índices en los subpatrones |
g | Explorar la cadena completa |
i | No distinguir mayúsuculas de minúsuculas |
m | Buscada en textos multilinea |
s | Incluye el salto de línea en el comodín punto . |
u | interpreta el patrón como secuencia de códigos CodePoints |
x | Ignora los espacios en el patrón |
y | buscar a partir del índiice actual en la cadena |
Ejemplos
El procesamiento de textos sería casi imposible son los patrones de espresiones regulares. Auqneu son un poco complejas al principio. Vamos algún ejemplo.
var respuesta = "El dijo: si";
var dijosi;
patron = /:\si$/;
dijosi = patron.test(respuesta);
Patrón definido por expresión entre /. Busca : un espacio (\s) y la palabra si al final ($). Por tanto en este caso dará true.
var numero = "23894";
var espat;
patron = /[02468]$/;
espar = patron.test(numero);
Un número es par si termina en 0,4, 2,,6,8. Eso es lo que dice el patrón.
var numero = "23894";
var espat;
patron = /[02468]$/;
espar = patron.test(numero);
Un código postal consta de 5 números y no puede empezar por un dígito mayor que 5
var numero = "23894";
var esCP;
patron = new RegExp('[0-5]\\d{4}');
esCP = patron.test(numero);
La tradicional, validar un email: un grupo de letras, digitos, surayados y puntos, luego un caracter @ seguido de un grupo de letras, luego un punto y finalmente un dominio de 2 a 4 caracteres.
var mail = "jota@mail.com";
var esMail;
var patron = /[a-z._\d]+@[a-z._\d]+\.[a-z]{2,4}/i
esMail = patron.test(mail);
Observa el uso del flag i como marca de insensible a mayúsculas en la definición de patron.
¿Y que tal comprobar si tenemos una imagen? Un nom bre de archivo imagen acaba en .gif, jpg, svg, png, webp
var archivo = "ejemplo.jpg";
var esImg;
var re;
re= new RegExp('^.+\.(jpg|gif|svg|png|webp)$', 'i');
esImg = re.test(archivo);
Pero también hablamos de que se pueden usar para reemplazar, pues por ejemplo tienes una plantilla y quieres cambiar todos las marcas # por fruta. Se usa el flag g para que sustituya todos los #
var texto= "Es necesario comer # a diario por que la # es sana";
var patron = new RegExp('#', 'g');
texto = texto.replace(patron, "fruta");
Estos y otros métodos de string los verás en la sección dedicada a estos objetos.
También odemos extraer subcadenas que cosrrespndan con un patrón, por ejemplo en esta lista sacamos todo los números de tres dígitos
var lista= "1 23 234 125 21 2457 456";
var patron = /(^|(?<=\s))(\d{3})((?=\s)|$)/g
var busca = lista.match(patron);
Este es un patrón complejo bastante avanzado, utiliza consultas adelante y atrás para asegurarse que hay un espacio antes o después del grupo de 3 dígitos, pero sin contar estos espacios como encontrados.