<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Expresiones_Regulares_con_JavaScript</id>
	<title>Expresiones Regulares con JavaScript - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Expresiones_Regulares_con_JavaScript"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Expresiones_Regulares_con_JavaScript&amp;action=history"/>
	<updated>2026-10-22T21:38:23Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=Expresiones_Regulares_con_JavaScript&amp;diff=68339&amp;oldid=prev</id>
		<title>Vieites: /* replace() */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Expresiones_Regulares_con_JavaScript&amp;diff=68339&amp;oldid=prev"/>
		<updated>2020-10-22T21:56:05Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;replace()&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Una expresión regular es un objeto que describe un patrón de caracteres. En JavaScript, las expresiones regulares se representan mediante objeto &amp;#039;&amp;#039;&amp;#039;RegExp&amp;#039;&amp;#039;&amp;#039;. Evidentemente, estos objetos se pueden crear con la constructora &amp;#039;&amp;#039;&amp;#039;RegExp()&amp;#039;&amp;#039;&amp;#039; pero normalmente se crean utilizando una sintaxis especial. Del mismo modo que los literales de cadena son caracteres especificados entre comillas, los literales de las expresiones regulares se especifican como caracteres dentro de un par de barras inclinadas (&amp;#039;&amp;#039;&amp;#039;/&amp;#039;&amp;#039;&amp;#039;). Por tanto, nuestro código JavaScript podría contener líneas como esta:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var patron = /[A-Z]+$/;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otro modo de definirla:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var patron = new RegExp(“[A-Z]+$”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tarea más difícil de definir una expresión regular es, justamente, describir el patrón de caracteres deseado utilizando la sintaxis de las expresiones regulares (puedes ver una pequeña ayuda en el [[Exmpresions_Regulares_en_Linux|siguiente enlace]]).&lt;br /&gt;
&lt;br /&gt;
: &amp;#039;&amp;#039;&amp;#039;Para seguir este apartado sobre Expresiones Regulares configura una pequeña web con los siguientes elementos: una caja de texto para introducir la expresión regular, una caja del tipo &amp;#039;&amp;#039;&amp;#039;textarea&amp;#039;&amp;#039;&amp;#039; para introducir el texto de trabajo, un botón para aplicar el patrón sobre el texto de trabajo y una etiqueta donde se mostrará la salida del programa/función.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Indicadores ==&lt;br /&gt;
Además de la gramática de las expresiones regulares, existe un elemento más, &amp;#039;&amp;#039;&amp;#039;los indicadores&amp;#039;&amp;#039;&amp;#039;, que especifican reglas de coincidencia de patrones. Veamos los existentes y qué realizan:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; : Ejecuta una coincidencia que no distingue entre minúsculas y mayúsculas.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;g&amp;#039;&amp;#039;&amp;#039; : Ejecuta una coincidencia global, es decir, encuentra todas las coincidencias en lugar de detenerse tras la primera.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; : Modo de múltiples líneas. Recordar que &amp;#039;&amp;#039;&amp;#039;^&amp;#039;&amp;#039;&amp;#039; coincide con el principio de una línea o de una cadena y &amp;#039;&amp;#039;&amp;#039;$&amp;#039;&amp;#039;&amp;#039; coincide con el final de una línea o de una cadena.&lt;br /&gt;
&lt;br /&gt;
La expresión regular, con indicadores, se definiría, por ejemplo, del modo que vemos en el siguiente código, donde se define una expresión regular para buscar todas las palabras que empiezan por “&amp;#039;&amp;#039;&amp;#039;c&amp;#039;&amp;#039;&amp;#039;” y terminan por “&amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039;” en un documento multilínea y buscando todas las coincidencias sin diferenciar entre mayúsculas y minúsculas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let strMyReg = “\bc\w*a\b”;&lt;br /&gt;
let myRe = new RegExp(expreReg, &amp;quot;gmi&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Otro modo de hacerlo sería el siguiente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let myRe = /\bc\w*a\b/gmi;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Métodos de cadena para coincidencia de patrones ==&lt;br /&gt;
Los objetos &amp;#039;&amp;#039;&amp;#039;String&amp;#039;&amp;#039;&amp;#039; admiten cuatro métodos que utilizan expresiones regulares. &lt;br /&gt;
=== search() ===&lt;br /&gt;
El más simple es &amp;#039;&amp;#039;&amp;#039;search()&amp;#039;&amp;#039;&amp;#039;. Este método acepta un argumento de expresión regular y devuelve la posición del carácter inicial de la primera subcadena coincidente, o &amp;#039;&amp;#039;&amp;#039;-1&amp;#039;&amp;#039;&amp;#039; si no existe ninguna coincidencia. Por ejemplo, la siguiente llamada devuelve 4:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
“JavaScript”.search(/script/i);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Decir que, &amp;#039;&amp;#039;&amp;#039;search()&amp;#039;&amp;#039;&amp;#039; no admite búsquedas globales.&lt;br /&gt;
&lt;br /&gt;
=== replace() ===&lt;br /&gt;
Otro método que tenemos es [https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/String/replace replace()], este método ejecuta una operación de búsqueda y reemplazo. Acepta una expresión regular como primer argumento y una cadena de reemplazo como segundo argumento. Si la expresión regular tiene establecido el indicador &amp;#039;&amp;#039;&amp;#039;g&amp;#039;&amp;#039;&amp;#039;, el método &amp;#039;&amp;#039;&amp;#039;replace()&amp;#039;&amp;#039;&amp;#039; reemplaza todas las coincidencias de la cadena con la cadena de reemplazo; en caso contrario, sólo reemplaza la primera coincidencia que encuentra.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var texto = `Si quieres hacer en javascript&lt;br /&gt;
un texto multilinea y no te acuerdas, &lt;br /&gt;
utiliza las comillas javascript inclinadas`&lt;br /&gt;
texto.replace(/javascript/gi, “JavaScript”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== match() ===&lt;br /&gt;
El método &amp;#039;&amp;#039;&amp;#039;match()&amp;#039;&amp;#039;&amp;#039; es el más general de los métodos de expresión regular del objeto &amp;#039;&amp;#039;&amp;#039;String&amp;#039;&amp;#039;&amp;#039;. Acepta una expresión regular como su único argumento y devuelve una matriz que contiene el resultado de la coincidencia. Si se establece el indicador &amp;#039;&amp;#039;&amp;#039;g&amp;#039;&amp;#039;&amp;#039;, el método devuelve una matriz con todas las coincidencias que aparecen en la cadena.&lt;br /&gt;
&lt;br /&gt;
En el siguiente ejemplo se guardan en un &amp;#039;&amp;#039;array&amp;#039;&amp;#039; los tres números existentes en el texto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var texto = `El número 1,&lt;br /&gt;
o el número 20, o, como no&lt;br /&gt;
el número 323.`&lt;br /&gt;
console.log(texto.match(/\d+/g));     //[“1”, “20”, “323”]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recordar agregar el indicador &amp;#039;&amp;#039;&amp;#039;g&amp;#039;&amp;#039;&amp;#039; para que se realice una búsqueda global y, así, cada elemento de la matriz será una coincidencia total. Si no se añade ese indicador &amp;#039;&amp;#039;&amp;#039;g&amp;#039;&amp;#039;&amp;#039;, el primer elemento de la matriz será la coincidencia completa y, los demás elementos de la matriz serán resultados de las subexpresiones entre paréntesis de la completa.&lt;br /&gt;
&lt;br /&gt;
=== split() ===&lt;br /&gt;
El último método de expresión regular del objeto &amp;#039;&amp;#039;&amp;#039;String&amp;#039;&amp;#039;&amp;#039; es &amp;#039;&amp;#039;&amp;#039;split()&amp;#039;&amp;#039;&amp;#039;, ya conocido por nosotros. Este método desglosa la cadena en una matriz de subcadenas, utilizando el argumento como separador. Por ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
“123, 456, 789”.split(“,”); //Devuelve [“123”, “456”, “789”]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El método &amp;#039;&amp;#039;&amp;#039;split()&amp;#039;&amp;#039;&amp;#039; también acepta una expresión regular como argumento. Así es mucho más eficaz. En el siguiente ejemplo se especifica una “&amp;#039;&amp;#039;&amp;#039;,&amp;#039;&amp;#039;&amp;#039;” por separador con un número arbitrario de espacios en blanco en ambos lados:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
“1, 2,  3, 4,   5”.split(/\s*,\s*/); &lt;br /&gt;
//Devuelve [“1”,”2”,”3”,”4”,”5”]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Objeto RegExp ==&lt;br /&gt;
Como sabemos, las expresiones regulares se representan como objetos &amp;#039;&amp;#039;&amp;#039;RegExp&amp;#039;&amp;#039;&amp;#039;. Así, tenemos, la función constructora &amp;#039;&amp;#039;&amp;#039;RegExp()&amp;#039;&amp;#039;&amp;#039;, tres métodos y diversas propiedades que veremos ahora.&lt;br /&gt;
&lt;br /&gt;
Podemos ver un ejemplo de la constructora &amp;#039;&amp;#039;&amp;#039;RegExp()&amp;#039;&amp;#039;&amp;#039;, donde se buscan los números de cinco dígitos en una cadena. Tener en cuenta que las cadenas y las expresiones regulares utilizan el carácter &amp;#039;&amp;#039;&amp;#039;\&amp;#039;&amp;#039;&amp;#039; para secuencias de escape por lo que, cuando se pasa una expresión regular a &amp;#039;&amp;#039;&amp;#039;RegExp()&amp;#039;&amp;#039;&amp;#039; como literal de cadena, hay que reemplazar cada carácter &amp;#039;&amp;#039;&amp;#039;\&amp;#039;&amp;#039;&amp;#039; por &amp;#039;&amp;#039;&amp;#039;\\&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let patron = new RegExp(“\\d{5}”, “g”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
¡Ojo!, porque si la expresión regular viene de una variable no hará falta esa doble &amp;#039;&amp;#039;&amp;#039;\\&amp;#039;&amp;#039;&amp;#039;. Ese detalle es interesante si leemos la expresión regular de una caja de texto o similar.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let regex = &amp;quot;\d{5}&amp;quot;;&lt;br /&gt;
let patron = new RegExp(regex, “g”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Métodos &amp;#039;&amp;#039;&amp;#039;RegExp&amp;#039;&amp;#039;&amp;#039; para coincidencia de patrones ===&lt;br /&gt;
Los objetos &amp;#039;&amp;#039;&amp;#039;RegExp&amp;#039;&amp;#039;&amp;#039; definen dos métodos que ejecutan operaciones de coincidencia de patrones.&lt;br /&gt;
&lt;br /&gt;
==== exec() ====&lt;br /&gt;
El método principal de coincidencia de patrones de &amp;#039;&amp;#039;&amp;#039;RegExp&amp;#039;&amp;#039;&amp;#039; es &amp;#039;&amp;#039;&amp;#039;exec()&amp;#039;&amp;#039;&amp;#039;, que es similar al método &amp;#039;&amp;#039;&amp;#039;match()&amp;#039;&amp;#039;&amp;#039; de &amp;#039;&amp;#039;&amp;#039;String&amp;#039;&amp;#039;&amp;#039;. En este caso, si no existe ninguna coincidencia, devuelve &amp;#039;&amp;#039;&amp;#039;null&amp;#039;&amp;#039;&amp;#039;. Si encuentra alguna coincidencia, devuelve un array con un comportamiento igual al método &amp;#039;&amp;#039;&amp;#039;match()&amp;#039;&amp;#039;&amp;#039; de &amp;#039;&amp;#039;&amp;#039;String&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Así y todo, para recuperar con &amp;#039;&amp;#039;&amp;#039;exec()&amp;#039;&amp;#039;&amp;#039; todas las coincidencias tal y como se realizó con &amp;#039;&amp;#039;&amp;#039;match()&amp;#039;&amp;#039;&amp;#039; tendríamos que hacer del siguiente modo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let texto = `El número 1,&lt;br /&gt;
o el número 20, o, como no&lt;br /&gt;
el número 323`;&lt;br /&gt;
let patron = new RegExp(&amp;quot;\\d+&amp;quot;, &amp;quot;g&amp;quot;);&lt;br /&gt;
let arraySal = new Array();&lt;br /&gt;
let arrayMatch = new Array(); //Este array tendrá todas las coincidencias&lt;br /&gt;
let sal = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
while ((arraySal = patron.exec(texto)) != null) {&lt;br /&gt;
    arrayMatch.push(arraySal[0]); //Vamos creando el array con todas las coincidencias&lt;br /&gt;
	sal +=&lt;br /&gt;
		&amp;quot; - Coincidencia : &amp;quot; +&lt;br /&gt;
		arraySal[0] +&lt;br /&gt;
		&amp;quot; --&amp;gt; en posición : &amp;quot; +&lt;br /&gt;
		arraySal.index +&lt;br /&gt;
		&amp;quot;\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
console.log(sal);&lt;br /&gt;
console.log(arrayMatch);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== test() ====&lt;br /&gt;
El otro método de &amp;#039;&amp;#039;&amp;#039;RegExp()&amp;#039;&amp;#039;&amp;#039; es &amp;#039;&amp;#039;&amp;#039;test()&amp;#039;&amp;#039;&amp;#039;. Este método acepta una cadena y devuelve &amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039; si ésta contiene una coincidencia para la expresión regular. Podemos aquí ver un ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
salida = patron.test(texto);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con &amp;#039;&amp;#039;&amp;#039;test()&amp;#039;&amp;#039;&amp;#039; podemos ir recorriendo todo el &amp;#039;&amp;#039;&amp;#039;String&amp;#039;&amp;#039;&amp;#039; a estudiar tal y como vimos para el método &amp;#039;&amp;#039;&amp;#039;exec()&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Tanto para &amp;#039;&amp;#039;&amp;#039;test()&amp;#039;&amp;#039;&amp;#039; como para &amp;#039;&amp;#039;&amp;#039;exec()&amp;#039;&amp;#039;&amp;#039; tener en cuenta que existe la propiedad &amp;#039;&amp;#039;&amp;#039;lastIndex&amp;#039;&amp;#039;&amp;#039; que nos indica dónde se encuentra la siguiente coincidencia de la encontrada en esos momentos. Así que, si en algún momento queremos “volver a empezar” tendremos que configurar esa propiedad a &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Propiedades de los objetos &amp;#039;&amp;#039;&amp;#039;RegExp&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
Los objetos &amp;#039;&amp;#039;&amp;#039;RegExp&amp;#039;&amp;#039;&amp;#039; tienen cinco propiedades:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Source&amp;#039;&amp;#039;&amp;#039; - cadena de sólo lectura que contiene el texto de la expresión regular.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Global&amp;#039;&amp;#039;&amp;#039; - valor booleano de sólo lectura que especifica si la expresión regular tiene el indicador &amp;#039;&amp;#039;&amp;#039;g&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;IgnoreCase&amp;#039;&amp;#039;&amp;#039; - valor booleano de sólo lectura que especifica si la expresión regular tiene el indicador &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Multiline&amp;#039;&amp;#039;&amp;#039; - valor booleano de sólo lectura que especifica si la expresión regular tiene el indicador &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;lastIndex&amp;#039;&amp;#039;&amp;#039; - entero de lectura/escritura. En patrones con el indicador &amp;#039;&amp;#039;&amp;#039;g&amp;#039;&amp;#039;&amp;#039;, esta propiedad guarda la posición de la cadena en la que se inicia la siguiente búsqueda.&lt;br /&gt;
&lt;br /&gt;
== Patrones complejos ==&lt;br /&gt;
A partir de los patrones sencillos ya conocidos, se pueden crear expresiones regulares mucho más complejas. Estos patrones están formados por grupos, referencias inversas, búsquedas directas y otras funciones complejas.&lt;br /&gt;
&lt;br /&gt;
=== Agrupar ===&lt;br /&gt;
Las agrupaciones se usan mediante la inclusión entre paréntesis de un conjunto de caracteres. Por ejemplo, si deseamos buscar la cadena “toctoc”, podemos hacerlo del siguiente modo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var expReg = /toctoc/g;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para modificar este patrón empleando agrupaciones lo haremos del siguiente modo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var expReg = /(toc){2}/g;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los paréntesis hacen una agrupación y, a continuación, entre llaves, indicamos el número de veces que queremos se repita (en este caso 2).&lt;br /&gt;
&lt;br /&gt;
Sin embargo, no estamos limitados al uso de llaves con grupos, existen otros cuantificadores:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var expReg1 = /(toc)?/g; // 0 o 1 instancias de “toc”&lt;br /&gt;
var expReg2 = /(toc)*/g; // 0 o más instancias de “toc”&lt;br /&gt;
var expReg3 = /(toc)+/g; // 1 o más instancias de “toc”&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Anexo cuantificadores&amp;#039;&amp;#039;&amp;#039; donde vemos la diferencia entre utilizar o no el símbolo ‘&amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039;’ después de ‘&amp;#039;&amp;#039;&amp;#039;*&amp;#039;&amp;#039;&amp;#039;’ y ‘&amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039;’ :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var texto = &amp;quot;tocxtocxxtocxxxxtoc&amp;quot;;&lt;br /&gt;
var expreReg1 = new RegExp(&amp;quot;.*toc&amp;quot;, &amp;quot;g&amp;quot;);&lt;br /&gt;
var expreReg2 = new RegExp(&amp;quot;.*?toc&amp;quot;, &amp;quot;g&amp;quot;);&lt;br /&gt;
var expreReg3 = new RegExp(&amp;quot;.+toc&amp;quot;, &amp;quot;g&amp;quot;);&lt;br /&gt;
var expreReg4 = new RegExp(&amp;quot;.+?toc&amp;quot;, &amp;quot;g&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
console.log(&amp;quot;Texto : &amp;quot; + texto);&lt;br /&gt;
console.log(&amp;quot;Patrón : &amp;#039;.*toc&amp;#039;-&amp;gt;Salida : &amp;quot; + texto.match(expreReg1));&lt;br /&gt;
console.log(&amp;quot;Patrón : &amp;#039;.*?toc&amp;#039;-&amp;gt;Salida : &amp;quot; + texto.match(expreReg2));&lt;br /&gt;
console.log(&amp;quot;Patrón : &amp;#039;.+toc&amp;#039;-&amp;gt;Salida : &amp;quot; + texto.match(expreReg3));&lt;br /&gt;
console.log(&amp;quot;Patrón : &amp;#039;.+?toc&amp;#039;-&amp;gt;Salida : &amp;quot; + texto.match(expreReg4));&lt;br /&gt;
&lt;br /&gt;
/* Salida:&lt;br /&gt;
Texto : tocxtocxxtocxxxxtoc&lt;br /&gt;
Patrón : &amp;#039;.*toc&amp;#039;-&amp;gt;Salida : tocxtocxxtocxxxxtoc&lt;br /&gt;
Patrón : &amp;#039;.*?toc&amp;#039;-&amp;gt;Salida : toc,xtoc,xxtoc,xxxxtoc&lt;br /&gt;
Patrón : &amp;#039;.+toc&amp;#039;-&amp;gt;Salida : tocxtocxxtocxxxxtoc&lt;br /&gt;
Patrón : &amp;#039;.+?toc&amp;#039;-&amp;gt;Salida : tocxtoc,xxtoc,xxxxtoc&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Incluso podemos crear grupos más complicados:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//1 o más instancias de “ba”, “da”, “bad”, “dad”&lt;br /&gt;
var expReg = /([bd]ad?)+/g;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos incluir grupos dentro de otros grupos:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//comparar “mamá” o “mamá y papá”&lt;br /&gt;
var expReg = /(mamá( y papá)?)/g;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con expresiones regulares podremos crear un método &amp;#039;&amp;#039;&amp;#039;trim()&amp;#039;&amp;#039;&amp;#039; para cadenas (implementado ya en JavaScript como &amp;#039;&amp;#039;&amp;#039;texto.trim()&amp;#039;&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var expEspExtra = /^\s+(.*?)\s+$/;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al utilizar esta expresión junto al método &amp;#039;&amp;#039;&amp;#039;replace()&amp;#039;&amp;#039;&amp;#039; del objeto &amp;#039;&amp;#039;&amp;#039;String&amp;#039;&amp;#039;&amp;#039; y empleando la técnica de referencias inversas, que veremos en el siguiente punto, podemos definir nuestro propio método &amp;#039;&amp;#039;&amp;#039;trim()&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
String.prototype.miTrim = function() {&lt;br /&gt;
    let expEspExtra = /^\s+(.*?)\s+$/;&lt;br /&gt;
    return this.replace(expEspExtra, &amp;quot;$1&amp;quot;);&lt;br /&gt;
};&lt;br /&gt;
// Como veremos a continuación “$1”&lt;br /&gt;
//es la primera referencia inversa&lt;br /&gt;
let texto =&amp;quot;    cosa   &amp;quot;;&lt;br /&gt;
console.log(texto);&lt;br /&gt;
console.log(texto.miTrim());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: &amp;#039;&amp;#039;&amp;#039;Esta técnica, de modificar los objetos predefinidos en JavaScript, se denomina [https://www.audero.it/blog/2016/12/05/monkey-patching-javascript/ Monkey patching] y no es muy recomendable realizarla.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Referencias inversas ===&lt;br /&gt;
Cuando se evalúa una expresión regular con los métodos &amp;#039;&amp;#039;&amp;#039;test()&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;match()&amp;#039;&amp;#039;&amp;#039; o &amp;#039;&amp;#039;&amp;#039;search()&amp;#039;&amp;#039;&amp;#039; (también con el método &amp;#039;&amp;#039;&amp;#039;replace()&amp;#039;&amp;#039;&amp;#039; de los objetos &amp;#039;&amp;#039;&amp;#039;String()&amp;#039;&amp;#039;&amp;#039;), se obtiene un grupo de coincidencias que se almacena en una ubicación especial para su posterior utilización. Este grupo de coincidencias tienen como nombre “referencias inversas”.&lt;br /&gt;
&lt;br /&gt;
Podemos realizar el siguiente ejemplo para entender como funcionan las referencias inversas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Definimos la expresión regular&lt;br /&gt;
const expEspExtra = /^\s+(\w+)\s+$/;&lt;br /&gt;
//Texto con el que vamos a trabajar&lt;br /&gt;
const texto = &amp;quot;   cosa   &amp;quot;;&lt;br /&gt;
//Aplicamos patrón al texto para buscar coincidencias&lt;br /&gt;
let coincidencias = texto.match(expEspExtra);&lt;br /&gt;
//Analizamos el objeto de salida&lt;br /&gt;
console.log(&amp;quot;Contenido del objeto: &amp;quot;);&lt;br /&gt;
console.log(coincidencias);&lt;br /&gt;
console.log(&amp;quot;Tipo de objeto: &amp;quot; + typeof(coincidencias));&lt;br /&gt;
console.log(&amp;quot;Número de elementos: &amp;quot; + coincidencias.length);&lt;br /&gt;
console.log(&amp;quot;Iteramos en cada uno de los elementos:&amp;quot;);&lt;br /&gt;
console.log(&amp;quot;\tClave --&amp;gt; Valor&amp;quot;);&lt;br /&gt;
for(let i in coincidencias) {&lt;br /&gt;
    console.log(&amp;quot;\t&amp;quot; + i + &amp;quot; --&amp;gt; &amp;quot; + coincidencias[i]);&lt;br /&gt;
}&lt;br /&gt;
/*Salida:&lt;br /&gt;
Contenido del objeto:&lt;br /&gt;
Array [ &amp;quot;   cosa   &amp;quot;, &amp;quot;cosa&amp;quot; ]&lt;br /&gt;
Tipo de objeto: object&lt;br /&gt;
Número de elementos: 2&lt;br /&gt;
Iteramos en cada uno de los elementos:&lt;br /&gt;
	Clave --&amp;gt; Valor&lt;br /&gt;
	0 --&amp;gt;    cosa  &lt;br /&gt;
	1 --&amp;gt; cosa&lt;br /&gt;
	index --&amp;gt; 0&lt;br /&gt;
	input --&amp;gt;    cosa  &lt;br /&gt;
	groups --&amp;gt; undefined&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
: &amp;#039;&amp;#039;&amp;#039;Como se comentó antes: al agregar el indicador &amp;#039;&amp;#039;g&amp;#039;&amp;#039; se realiza una búsqueda global y, así, cada elemento de la matriz será una coincidencia total. Si no se añade ese indicador &amp;#039;&amp;#039;g&amp;#039;&amp;#039;, el primer elemento de la matriz será la coincidencia completa y, los demás elementos de la matriz serán resultados de las subexpresiones entre paréntesis de la completa.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Vemos que podemos acceder a las referencias inversas del siguiente modo:&lt;br /&gt;
* Primera referencia inversa : coincidencias[1]&lt;br /&gt;
* Segunda referencia inversa : coincidencias[2]&lt;br /&gt;
* ...&lt;br /&gt;
Otro modo de acceder a ellas será utilizando el objeto &amp;#039;&amp;#039;&amp;#039;RegExp&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Primera referencia inversa : RegExp.$1&lt;br /&gt;
* Segunda referencia inversa : RegExp.$2&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Por último, las referencias inversas pueden utilizarse con el método &amp;#039;&amp;#039;&amp;#039;replace()&amp;#039;&amp;#039;&amp;#039; de &amp;#039;&amp;#039;&amp;#039;String&amp;#039;&amp;#039;&amp;#039; con las secuencias de caracteres especiales &amp;#039;&amp;#039;&amp;#039;$1&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;$2&amp;#039;&amp;#039;&amp;#039;, etc. El mejor ejemplo para ilustrarlo cosiste en invertir el orden de dos elementos de una cadena. Imagina que deseas cambiar la cadena &amp;quot;1234 5678&amp;quot; por &amp;quot;5678 1234&amp;quot;. Podríamos hacerlo del siguiente modo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const textoBase = `Esta es una secuencia&lt;br /&gt;
 de números 1234 5678 muy interesante.`&lt;br /&gt;
const patron = /(\d{4})\s+(\d{4})/;&lt;br /&gt;
let textoNuevo = textoBase.replace(patron, &amp;quot;$2 $1&amp;quot;);&lt;br /&gt;
//Vemos cómo se realiza el cambio:&lt;br /&gt;
console.log(&amp;quot;Texto base: &amp;quot;);&lt;br /&gt;
console.log(textoBase);&lt;br /&gt;
console.log(&amp;quot;Coincidencias con el patrón :&amp;quot; + patron);&lt;br /&gt;
console.log(textoBase.match(patron));&lt;br /&gt;
console.log(&amp;quot;Con el método replace() cambiamos de orden&amp;quot;)&lt;br /&gt;
console.log(`Así $1: ${RegExp.$1} y $2: ${RegExp.$2}`);&lt;br /&gt;
console.log(&amp;quot;El texto ahora queda así: &amp;quot;);&lt;br /&gt;
console.log(textoNuevo);&lt;br /&gt;
/*Salida:&lt;br /&gt;
Texto base:&lt;br /&gt;
Esta es una secuencia&lt;br /&gt;
 de números 1234 5678 muy interesante.&lt;br /&gt;
Coincidencias con el patrón :/(\d{4})\s+(\d{4})/&lt;br /&gt;
Array(3) [ &amp;quot;1234 5678&amp;quot;, &amp;quot;1234&amp;quot;, &amp;quot;5678&amp;quot; ]&lt;br /&gt;
Con el método replace() cambiamos de orden&lt;br /&gt;
Así $1: 1234 y $2: 5678&lt;br /&gt;
El texto ahora queda así:&lt;br /&gt;
Esta es una secuencia&lt;br /&gt;
 de números 5678 1234 muy interesante.&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alternar ===&lt;br /&gt;
Imagina que quieres buscar en un texto la existencia de las palabras &amp;quot;roja&amp;quot; y &amp;quot;negra&amp;quot;con una única expresión. Estas palabras no tienen caracteres en común, por lo que deberías aplicar el operador &amp;#039;&amp;#039;&amp;#039;OR&amp;#039;&amp;#039;&amp;#039; en nuestra expresión regular. El modo de hacerlo es utilizando la barra (&amp;#039;&amp;#039;&amp;#039;|&amp;#039;&amp;#039;&amp;#039;) tal y como podemos ver en el siguiente ejemplo. En él se utiliza [https://es.wikipedia.org/wiki/Bandera_de_Albania el texto de la Wikipedia sobre el origen de la bandera de Albania] y buscamos en él la existencia o no de las palabras &amp;quot;negra/o&amp;quot; o &amp;quot;roja/o&amp;quot;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const texto = `La bandera de Albania es una bandera roja con un águila bicéfala negra en el centro. Tiene su origen en un sello similar de Gjergj Kastriot Skanderbeg, un albanés del siglo XV que condujo la revuelta contra el Imperio otomano, y que acabó en una breve independencia para Albania entre 1443 y 1478.`&lt;br /&gt;
const patronRojoNegro = /(roj[oa]|negr[oa])/;&lt;br /&gt;
console.log(texto);&lt;br /&gt;
console.log(patronRojoNegro.test(texto)); //Devuelve true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Grupos sin captura ===&lt;br /&gt;
Los grupos que crean referencias inversas se denominan también &amp;quot;grupos de captura&amp;quot;. En expresiones regulares muy extensas, el almacenamiento de referencias inversas ralentiza el proceso de búsqueda. JavaScript permite realizar &amp;quot;grupos sin captura&amp;quot; para no sobrecargar el sistema. Para realizarlo sólo tendremos que acompañar el paréntesis de apertura de un interrogante y dos puntos &amp;quot;&amp;#039;&amp;#039;&amp;#039;(?: ... )&amp;#039;&amp;#039;&amp;#039;&amp;quot;. Como en el siguiente ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const textoBase = `Ésta es una secuencia&lt;br /&gt;
 de números 1234 5678 muy interesante.`&lt;br /&gt;
const patronCC = /(\d{4})\s+(\d{4})/;&lt;br /&gt;
const patronSC = /(?:\d{4})\s+(?:\d{4})/;&lt;br /&gt;
//Comprobamos la existencia o no de Referencias inversas&lt;br /&gt;
console.log(&amp;quot;Con Captura:&amp;quot;);&lt;br /&gt;
console.log(textoBase.match(patronCC));&lt;br /&gt;
console.log(&amp;quot;Sin Captura:&amp;quot;);&lt;br /&gt;
console.log(textoBase.match(patronSC));&lt;br /&gt;
/*Salida:&lt;br /&gt;
Con Captura:&lt;br /&gt;
Array(3) [ &amp;quot;1234 5678&amp;quot;, &amp;quot;1234&amp;quot;, &amp;quot;5678&amp;quot; ]&lt;br /&gt;
Sin Captura:&lt;br /&gt;
Array [ &amp;quot;1234 5678&amp;quot; ]&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Búsquedas directas ===&lt;br /&gt;
En ocasiones es necesario capturar un determinado grupo de caracteres sólo si aparecen antes que otro grupo de caracteres. El uso de búsquedas directas facilita esta operación.&lt;br /&gt;
&lt;br /&gt;
Existen búsquedas directas negativas y positivas. Para crear una &amp;#039;&amp;#039;&amp;#039;búsqueda directa positiva&amp;#039;&amp;#039;&amp;#039; es necesario incluir un patrón entre &amp;#039;&amp;#039;&amp;#039;(?=&amp;#039;&amp;#039;&amp;#039;  y  &amp;#039;&amp;#039;&amp;#039;)&amp;#039;&amp;#039;&amp;#039;. Ojo con estos paréntesis, pues no representan un grupo. Para crear una &amp;#039;&amp;#039;&amp;#039;búsqueda directa negativa&amp;#039;&amp;#039;&amp;#039; es necesario incluir un patrón entre &amp;#039;&amp;#039;&amp;#039;(?!&amp;#039;&amp;#039;&amp;#039;  y  &amp;#039;&amp;#039;&amp;#039;)&amp;#039;&amp;#039;&amp;#039;. Podemos ver un ejemplo para que quede más claro el concepto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Texto de trabajo&lt;br /&gt;
let texto = `En Compostela se realiza compostaje.`;&lt;br /&gt;
//Expresiones Regulares&lt;br /&gt;
let rePositiva = /(compos(?=tela))/gmi;&lt;br /&gt;
let reNegativa = /(compos(?!taje))/gmi;&lt;br /&gt;
//Búsqueda de coincidencias&lt;br /&gt;
console.log(texto.search(rePositiva)); &lt;br /&gt;
//Salida: 3  (Posición inicio Compostela)&lt;br /&gt;
console.log(texto.search(reNegativa)); &lt;br /&gt;
//Salida: 3  (Posición inicio Compostela)&lt;br /&gt;
&lt;br /&gt;
//Cambiamos las Expresiones Regulares&lt;br /&gt;
rePositiva = /(compos(?=taje))/gmi;&lt;br /&gt;
reNegativa = /(compos(?!tela))/gmi;&lt;br /&gt;
//Búsqueda de coincidencias&lt;br /&gt;
console.log(texto.search(rePositiva)); &lt;br /&gt;
//Salida: 25  (Posición inicio compostaje)&lt;br /&gt;
console.log(texto.search(reNegativa)); &lt;br /&gt;
//Salida: 25  (Posición inicio compostaje)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patrones comunes ==&lt;br /&gt;
En la web las expresiones regulares se suelen utilizar para validar entradas del usuario antes de enviar los datos al servidor. Alguno de los patrones más utilizados en Web son los siguientes:&lt;br /&gt;
&lt;br /&gt;
=== Fechas ===&lt;br /&gt;
Formato dd/mm/aaaa genérico y con &amp;quot;grupos con captura&amp;quot; para acceder al día, al mes y al año independientemente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let texto = &amp;quot;Naciste el día 14/12/2020, día de Nochebuena&amp;quot;;&lt;br /&gt;
let reFecha = /(\d{1,2})\/(\d{1,2})\/(\d{4})/g;&lt;br /&gt;
let coincidencias = texto.match(reFecha);&lt;br /&gt;
console.log(coincidencias);&lt;br /&gt;
//Salida: &amp;quot;14/12/2020&amp;quot;&lt;br /&gt;
//Prueba cuál sería la salida si no pones el parámetro &amp;#039;g&amp;#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El problema es que podemos tener días y meses fuera de rango : 55/42/2004&lt;br /&gt;
&lt;br /&gt;
Podemos ir diseñando una mejor RegExp para las fechas:&lt;br /&gt;
* Patrón lógico para días:&lt;br /&gt;
: &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let reDia = /[0-3]?[0-9]/;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Así y todo, existen días erróneos como del 32 al 39. Para solucionarlo:&lt;br /&gt;
: &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let reDia = /0[1-9]|[12][0-9]|3[01]/;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* El patrón de meses será muy similar:&lt;br /&gt;
: &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let reMes = /0[1-9]|1[0-2]/;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Para el año, podemos centrarnos entre el 1900 y 2099:&lt;br /&gt;
: &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let reAno = /19|20\d{2}/;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Así, podemos combinar todos los patrones y, además, utilizando &amp;quot;grupos sin captura&amp;quot; para cada parte. Aunque también podríamos dejarlos con captura si fuese necesario para algo.&lt;br /&gt;
: &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let reFecha = /(?:0[1-9]|[12][0-9]|3[01])\/(?:0[1-9]|1[0-2])\/(?:19|20\d{2})/;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por último, es mucho más sencillo utilizar una función para comprobar la validez de una fecha, por lo que utilizaremos esta expresión regular para crear la función &amp;#039;&amp;#039;&amp;#039;esFechaValida()&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Esta función devuelve &amp;#039;true&amp;#039; o &amp;#039;false&amp;#039; dependiendo si el texto es una fecha.&lt;br /&gt;
function esFechaValida(texto) {&lt;br /&gt;
    let reFecha = /(?:0[1-9]|[12][0-9]|3[01])\/(?:0[1-9]|1[0-2])\/(?:19|20\d{2})/;&lt;br /&gt;
    return reFecha.test(texto); }&lt;br /&gt;
// -- //&lt;br /&gt;
//Sería interesante realizar una función que, dado un texto, &lt;br /&gt;
// devuelva un array con todas las fechas existentes&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tarjetas de crédito ===&lt;br /&gt;
Hoy en día, el uso de las [https://es.wikipedia.org/wiki/N%C3%BAmero_de_tarjeta_bancaria tarjetas de crédito] está muy extendido para el pago &amp;#039;&amp;#039;online&amp;#039;&amp;#039;. Así que, será necesario la validación de dichos identificadores en muchos formularios.&lt;br /&gt;
&lt;br /&gt;
Para empezar, podemos utilizar un número de &amp;#039;&amp;#039;&amp;#039;[https://www.mastercard.es/es-es.html MasterCard]&amp;#039;&amp;#039;&amp;#039;, que debe tener 16 dígitos. De éstos, los dos primeros números deben estar comprendidos entre 51 y 55. El patrón será el siguiente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let reMasterCard = /^5[1-5]\d{14}$/;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este patrón es correcto pero los números de &amp;#039;&amp;#039;&amp;#039;[https://www.mastercard.es/es-es.html MasterCard]&amp;#039;&amp;#039;&amp;#039; se pueden introducir con espacios o guiones entre grupos de cuatro dígitos, como en 5555-5555-5555-5555, algo que también debemos tener en cuenta:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let reMasterCard = /^5[1-5]\d{2}([\s-]?\d{4}){3}$/;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La validación real de números de tarjeta de crédito requiere utilizar el &amp;#039;&amp;#039;&amp;#039;[https://gist.github.com/DiegoSalazar/4075533 algoritmo de Luhn]&amp;#039;&amp;#039;&amp;#039;. Para aplicarle el algoritmo a cada uno de los números, es necesario extraerlos de la entrada del usuario, lo que implica utilizar grupos de captura en la expresión regular:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let reMasterCard = /^(5[1-5]\d{2})[\s\-]?(\d{4})[\s\-]?(\d{4})[\s\-]?(\d{4})$/;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ya podemos empezar a crear una función para validar un número de &amp;#039;&amp;#039;&amp;#039;MasterCard&amp;#039;&amp;#039;&amp;#039;. El primer paso consiste en probar una determinada cadena en función del patrón. Si la cadena coincide, añadimos los grupos de cuatro dígitos a la misma (por ejemplo : “5432-1234-5678-9012” se convertiría en “5432123456789012”).&lt;br /&gt;
&lt;br /&gt;
Esa secuencia de números es la que le tenemos que pasar a la función que implementa el &amp;#039;&amp;#039;&amp;#039;algoritmo de Luhn&amp;#039;&amp;#039;&amp;#039; y que podemos bajar de la web.&lt;br /&gt;
 &lt;br /&gt;
El código de las dos funciones quedaría del siguiente modo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Función implementación algoritmo de Luhn&lt;br /&gt;
function valid_credit_card(value) {&lt;br /&gt;
    // Accept only digits, dashes or spaces&lt;br /&gt;
    if (/[^0-9-\s]+/.test(value)) return false;&lt;br /&gt;
    // The Luhn Algorithm. It&amp;#039;s so pretty.&lt;br /&gt;
    let nCheck = 0, bEven = false;&lt;br /&gt;
    value = value.replace(/\D/g, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (var n = value.length - 1; n &amp;gt;= 0; n--) {&lt;br /&gt;
        var cDigit = value.charAt(n), nDigit = parseInt(cDigit, 10);&lt;br /&gt;
        if (bEven &amp;amp;&amp;amp; (nDigit *= 2) &amp;gt; 9) nDigit -= 9;&lt;br /&gt;
        nCheck += nDigit;&lt;br /&gt;
        bEven = !bEven;&lt;br /&gt;
    }&lt;br /&gt;
    return (nCheck % 10) == 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Función programada por nosotros que valida&lt;br /&gt;
//la Tarjeta de Crédito llamando a la función de Luhn&lt;br /&gt;
function esValidaMasterCard(sText) {&lt;br /&gt;
    let reMasterCard = /^(5[1-5]\d{2})[\s\-]?(\d{4})[\s\-]?(\d{4})[\s\-]?(\d{4})$/;&lt;br /&gt;
    if (reMasterCard.test(sText)) {&lt;br /&gt;
        let sNumTar = RegExp.$1 + RegExp.$2 + RegExp.$3 + RegExp.$4; &lt;br /&gt;
        //Comprobamos alguna salida&lt;br /&gt;
        console.log(&amp;quot;Array salida método match:&amp;quot;);&lt;br /&gt;
        console.log(sText.match(reMasterCard));&lt;br /&gt;
        console.log(&amp;quot;Texto que se le pasa a Luhn: &amp;quot; + sNumTar);&lt;br /&gt;
        //Realizamos aquí llamada a la función &lt;br /&gt;
        //que implementa el algoritmo de Luhn&lt;br /&gt;
        return valid_credit_card(sNumTar); } &lt;br /&gt;
    else { return false; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Hacemos una comprobación&lt;br /&gt;
let numTarjeta = &amp;quot;5432-1234-5678-9012&amp;quot;;&lt;br /&gt;
let valida = esValidaMasterCard(numTarjeta);&lt;br /&gt;
console.log(&amp;quot;La tarjeta con número &amp;quot; + numTarjeta + &amp;quot; es válida? &amp;quot; + valida);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de otras tarjetas de crédito, como vemos, la comprobación de la validez de su número va a ser similar, pues casi todas se basan en que cumplan el algoritmo de Luhn.&lt;br /&gt;
&lt;br /&gt;
=== Direcciones de correo electrónico ===&lt;br /&gt;
La creación de un patrón para comparar todas las direcciones válidas de correo eléctrónico es una labor compleja. Hay que saber que, la especificación que define la validez de una dirección de correo es [https://tools.ietf.org/html/rfc2822 RFC 2822], que considera válidos los siguientes patrones:&lt;br /&gt;
* andrea@dominio.com&lt;br /&gt;
* andrea.torres@dominio.com&lt;br /&gt;
* Andrea Torres  &amp;lt;andrea.torres@dominio.com&amp;gt;&lt;br /&gt;
* &amp;quot;andrea.torres&amp;quot;@dominio.com&lt;br /&gt;
* andrea@[10.1.3.1]&lt;br /&gt;
&lt;br /&gt;
Está claro que, de todas éstas, los usuarios suelen utilizar las dos primeras en sitios y aplicaciones Web, por lo que nos centraremos en la validación de estos patrones. Así, tendremos en cuenta las siguientes normas:&lt;br /&gt;
* Una dirección de correo electrónico está formada por una serie de caracteres (números, letras, guiones, puntos o cualquier otro menos espacios), seguidos por un símbolo &amp;#039;&amp;#039;&amp;#039;@&amp;#039;&amp;#039;&amp;#039;, seguido por más caracteres.&lt;br /&gt;
* Por delante del símbolo &amp;#039;&amp;#039;&amp;#039;@&amp;#039;&amp;#039;&amp;#039; debe haber, al menos, un carácter.&lt;br /&gt;
* Por detrás del símbolo &amp;#039;&amp;#039;&amp;#039;@&amp;#039;&amp;#039;&amp;#039; debe haber, al menos, tres caracteres, el segundo de los cuales ha de ser un punto (&amp;#039;&amp;#039;&amp;#039;a@a.b&amp;#039;&amp;#039;&amp;#039; es una dirección válida, mientras que &amp;#039;&amp;#039;&amp;#039;a@a&amp;#039;&amp;#039;&amp;#039; no lo es).&lt;br /&gt;
* El texto que aparece por delante y por detrás del símbolo &amp;#039;&amp;#039;&amp;#039;@&amp;#039;&amp;#039;&amp;#039; nunca puede comenzar ni terminar en punto, y no puede tener dos puntos seguidos.&lt;br /&gt;
&lt;br /&gt;
Así pues, la expresión regular sería la siguiente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let reEmail = /^(?:\w+\.?)*\w+@(?:\w+\.)+\w+$/;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y así, la función de validación quedaría del siguiente modo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function esValidoEmail(sText) {&lt;br /&gt;
    let reEmail = /^(?:\w+\.?)*\w+@(?:\w+\.)+\w+$/;&lt;br /&gt;
    return reEmail.test(sText);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[JavaScript|Volver]]&lt;/div&gt;</summary>
		<author><name>Vieites</name></author>
	</entry>
</feed>