Espera por favor...

JavaScript, expresiones regulares
Introducción

Las expresiones regulares son patrones utilizados para encontrar una determinada combinación de caracteres dentro de una cadena de texto.

En JavaScript, las expresiones regulares también son objetos.

Estos patrones se utilizan en algunos métodos.

Se emplean para:
  • Búsqueda y reemplazo de un patrón en una cadena.
  • Validación de campos en un formulario.

JavaScript, expresiones regulares
Creación de una expresión regular

Una expresión regular puede crearse de cualquiera de las dos siguientes maneras:

Utilizando una representación literal de la expresión regular, consistente en un patrón encerrado entre diagonales:

var re = /ab+c/;

La representación literal ofrece la compilación de la expresión regular cuando se carga el script donde se encuentra. Si la expresión regular permanece constante, utilizar esta forma puede mejorar en rendimiento.

Llamando a la función constructora del objeto RegExp:

var re = new RegExp('ab+c');

El uso de la función constructora ofrece la compilación en tiempo de ejecución de la expresión regular. Es habitual usar la función constructora cuando se sabe que el patrón de la expresión regular cambiará, o cuando se desconozca el patrón y se obtenga de otra fuente, como por ejemplo del usuario.

JavaScript, expresiones regulares
Creación de una expresión regular

Un patrón de expresión regular se compone de:
  • caracteres simples, como /abc/,
  • una combinación de caracteres simples y especiales, como /ab*c/ o /Capítulo (\d+)\.\d*/.

El segundo caso incluye paréntesis, que se emplean como un recurso de memoria. La coincidencia encontrada por esta parte del patrón es almacenada para posterior uso

JavaScript, expresiones regulares
Sintaxis de un patrón de expresión regular

Patrones simples
Los patrones simples se construyen con caracteres para los que se desea una coincidencia exacta. Por ejemplo, el patrón /abc/ coincidirá sólo con esta secuencia y orden de caracteres 'abc'. Tal expresión tendría resultados en las cadenas "Pregunta, ¿conoces el abc?" y "Los últimos diseños surgieron a partir de slabcraft." En ambos existe una coincidencia exacta con la subcadena 'abc'. Sin embargo, no habría coincidencia en la cadena 'Abdulab calló' debido a que, a pesar de que contiene los caracteres 'a', 'b' y 'c', la secuencia exacta 'abc' no aparece.

Caracteres especiales
Cuando la búsqueda de coincidencias requiere algo más que una coincidencia exacta, como por ejemplo el encontrar una o más 'b', o encontrar espacios en blanco, se incluyen en el patrón caracteres especiales. Por ejemplo, el patrón /ab*c/ coincidirá con cualquier secuencia de caracteres en la cual una 'a' preceda a cero o más 'b' y sea inmediatamente seguida por una 'c'. En la cadena 'cbbabbbbcdebc,' el patrón coincidirá con la subcadena 'abbbbc'.

JavaScript, expresiones regulares
Sintaxis de un patrón de expresión regular

Caracteres especiales para expresiones regulares
Carácter Significado
\

Buscará coincidencias conforme a las siguientes reglas:

Una barra invertida precediendo un carácter no especial indica que éste debe ser interpretado como un carácter especial y no de forma literal. Por ejemplo, una 'b' sin '\' precediéndole coincidirá con cualquier 'b' minúscula en la cadena, sin embargo, '\b' no coincidirá con algún carácter en específico; representará el delimitador especial de palabras.

Una barra invertida que precede a un carácter especial indica que éste deberá ser interpretado literalmente, esto es, como un carácter simple y no como un carácter especial. A esto se le demonina escapado. Por ejemplo, en el patrón /a*/ el '*' indica que se deberá buscar una secuencia de 'a' cero o más veces; por el contrario, el cambiar el patrón a  /a\*/ , el carácter especial es interpretado como un carácter simple, y cadenas como 'a*' harán coincidencia.

No se olvide de escapar la propia barra invertida al usarla en expresiones regulares con cadenas - RegExp("patron") - ya que la \ es un carácter de escapado en cadenas.

^ Coincide con el principio de la entrada. Si el interruptor o bandera de multilínea está activada, también coincidirá inmediatamente después de un salto de línea.

Por ejemplo, /^A/ no coincide con la 'A' en "an A", pero sí con la 'A' en "An E".

El carácter '^' tiene un significado diferente cuando aparece como el primer carácter en un patrón tipo conjunto o grupo. Véase patrones complementarios para mayores detalles y ejemplos.
$

Busca el final de la entrada. Si interruptor o bandera de multilínea se establece en true, también buscará inmediatamente antes de un carácter de salto de línea.

Por ejemplo, la expresión /r$/ no encontrará el carácter 'r' en la cadena "cenaremos", pero sí la encontrará en la cadena "cenar".

*

Busca el carácter precedente 0 (cero) o más veces. Es equivalente a {0,}.

Por ejemplo, la expresión /bo*/ encontrará la subcadena 'boooo' en la cadena "Y el fantasma hizo boooo" y el carácter 'b' en la cadena "Un pajaro bebía agua", pero no encontrará nada en la cadena "Un perro ladró".

+

Busca el carácter precedente 1 o más veces. Es equivalente a {1,}.

Por ejemplo, la expresión /u+/ encontrará el carácter 'u' en la cadena "dulce" y todos los caracteres 'u' en la cadena "duuuuulce".

? Busca el carácter precedente 0 (cero) o 1 (una) vez. Es equivalente a {0,1}.

Por ejemplo, la expresión /e?le?/ encontrará la subcadena 'el' en la cadena "angel" y la subcadena 'le' en la cadena "abominable" y también el carácter 'l' en la cadena "muslo".

Si se utiliza inmediatamente después que cualquiera de los cuantificadores *, +, ?, o {}, hace que el cuantificador no sea expansivo (encontrando la menor cantidad posible de caracteres), en comparación con el valor predeterminado, que sí es expansivo (encontrando tantos caracteres como le sea posible). Por ejemplo, aplicando la expresión /\d+/ a la cadena "123abc" encuentra "123". Pero aplicando la expresión /\d+?/ a la misma cadena, encuentra solamente el carácter "1".

También se utiliza en coincidencias previsivas, como se describe en las entradas x(?=y)  y  x(?!y) de esta tabla.
 
.

(El punto decimal) coincide con cualquier carácter precedente excepto un carácter de nueva línea.

Por ejemplo , /.n/ coincide 'an' y 'on' en "nay, an apple is on the tree", pero no 'nay'.

(x)

Busca 'x' y recuerda la búsqueda, como muestra el siguiente ejemplo. Los paréntesis son llamados paréntesis de captura

El '(foo)' y '(bar)' en el patrón  /(foo) (bar) \1 \2/ busca y recuerda las primeras dos palabras en el string  "foo bar foo bar". El \1 y \2 en el patron hacen que coincida las dos últimas palabras de la cadena. Note que \1, \2, \n son usados en la parte donde se define la expresión regular. Cuando se usan en la parte de reemplazo, se debe usar la sintaxis  $1$2, ...,  $n en su lugar  'bar foo'.replace( /(...) (...)/, '$2 $1' ). $ & significa la secuencia completa.   

(?:x) Coincide con 'x' pero no recuerda la coincidencia. Los paréntesis son llamados paréntesis no capturadores, y permiten definir subexpresiones para manipular con los operadores de las expresiones regulares. Considera la expresión de ejemplo /(?:foo){1,2}/.  Si la expresión fuera /(foo){1,2}/, los caracteres {1,2}  se aplicarían sólo a la última 'o' en 'foo'. Con los paréntesis no capturadores, {1,2} se aplica a la palabra entera 'foo'.
x(?=y)

Coincide con 'x' sólo si 'x' es seguida por 'y'. Esto se denomina previsión (lookahead, mirar adelante).

Por ejemplo, /Jack(?=Sprat)/ coincide con 'Jack' solo si es seguido por 'Sprat'. /Jack(?=Sprat|Frost)/ conicide con 'Jack' solo si es seguido por 'Sprat' o 'Frost'. Sin embargo, ni 'Sprat' ni 'Frost' serán parte del resultado.

x(?!y)

Coincide con 'x' solo si 'x' no es seguida por 'y'. Es una previsión negativa.

Por ejemplo, /\d+(?!\.)/ coincide con numeros solo si no vienen seguidos por un punto decimal. La expresion regular /\d+(?!\.)/.exec("3.141") coincide con '141' pero no con '3.141'.

x|y

Coincide con 'x' o 'y' (si no hay coincidencias para 'x').

Por ejemplo, /green|red/ coincide con 'green' en "green apple" y 'red' en "red apple."

{n} Coincide exactamente con n ocurrencias de la expresión. N debe ser un entero positivo.

Por ejemplo, /a{2}/ no coincide con la 'a' en "candy," pero si con las a de "caandy," y las 2 primeras a en "caaandy."
{n,m}

Donde n y m son enteros positivos y n <= m. Coincide con al menos n y no más de m ocurrencias de la expresión. Si se omite m, no tiene limite de máximo.

Por ejemplo, /a{1,3}/ no coincide con "cndy", pero sí con la 'a' en "candy," las primeras 2 a en "caandy," y las primeras 3 a en "caaaaaaandy". Note que en "caaaaaaandy", la coincidencia es "aaa", aunque la cadena contenga más a en ella.

[xyz] Grupo de caracteres. Este tipo de patrón coincide con cada carácter dentro de los corchetes, incluyendo secuencias de escapado. Caracteres especiales como el punto (.) y el asterisco (*) no son especiales en un grupo, así que no necesitan ser escapados. Puede especificar un rango utilizando un guión, como en el siguiente ejemplo.

El patrón [a-d], que equivale a [abcd], coincide con la 'b' en "brisket" y la 'c' in "city". El patrón /[a-z.]+//[\w.]+/ coinciden con toda la cadena "test.i.ng".
[^xyz]

Grupo de caracteres negativo. Significa que coincide con cualquier cosa que no esté en los corchetes. Puede especificar rangos. Todo lo que funciona en el grupo de caracteres positivo funciona también aquí.

Por ejemplo, [^abc] es lo mismo que [^a-c], y coincide con la 'r' en "brisket" y 'h' en "chop."

[\b] Coincide con backspace (U+0008). Debe ir entre corchetes. (No confundir con \b.)
\b

Coincide con un limite de palabra. Un limite de palabra coincide con la posición entre donde un carácter de palabra no viene precedido o seguido por otro. Nótese que el límite no estará incluido en la coincidencia. En otras palabras, la longitud del limite es cero. (No confundir con [\b].)

Ejemplos:
/\bm/ coincide con la 'm' de "moon" ;
/oo\b/ no tiene coincidencias en "moon", porque las 'oo' estan seguidas de una 'n' que es un carácter de palabra;
/oon\b/ coincide con 'oon' en "moon", porque 'oon' es el final de la cadena, por lo cual no va seguido de un carácter de palabra;
/\w\b\w/ no coincidirá con nada, porque un carácter de palabra no puede estar seguido por ambos, un limite y un carácter de palabra.

Nota: El motor de expresiones regulares de JavaScript define un conjunto específico de caracteres que son caracteres "palabra". Cualquier caracter que no está en ese conjunto se considera una ruptura de palabra. Este conjunto de caracteres es bastante limitado: consiste consiste únicamente en el alfabeto romano, tanto en mayúscula como minúscula, dígitos decimales, y el caracter de subrayado. Los caracteres acentuados, como "é" o "ü" son tratados, desafortunadamente, como rupturas de palabra.

\B

Coincide con un no-limite de palabra. Esto coincide con una posicion donde el anterior y el siguiente carácter son del mismo tipo: ambos son o no son caracteres de palabra. El inicio y el final de una cadena se consideran no palabras.

Por ejemplo, /\B../ coincide con 'oo' en "noonday", y /y\B./ coincide con 'ye' en "possibly yesterday."

\cX

Donde X es un carácter entre A y Z. Coincide con un carácter de control en un string.

Por ejemplo, /\cM/ coincide con control-M (U+000D) en un string.

\d

Coincide con un carácter de número. Equivalente a [0-9].

Por ejemplo, /\d/ or /[0-9]/ coinciden con el '2' en "B2 is the suite number."

\D

Coincide con cualquier carácter no numérico. Equivalente a [^0-9].

Por ejemplo, /\D/ or /[^0-9]/ coincide con la 'B' en "B2 is the suite number."

\f Coincide con un form feed (salto de página) (U+000C).
\n Coincide con un line feed (salto de linea) (U+000A).
\r Coincide con un carriage return (retorno de carro) (U+000D).
\s

Coincide con un carácter de espacio, entre ellos incluidos espacio, tab, salto de página, salto de linea y retorno de carro. Equivalente a [\f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008​\u2009\u200a​\u2028\u2029​​\u202f\u205f​\u3000].

Por ejemplo, /\s\w*/ coincide con ' bar' en "foo bar."

\S

Coincide con todo menos caracteres de espacio. Equivalente a [^ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008​\u2009\u200a​\u2028\u2029​\u202f\u205f​\u3000].

Por ejemplo, /\S*/ coincide con 'foo' en "foo bar."

\t Coincide con tab (U+0009).
\v Coincide con tab vertical (U+000B).
\w

Coincide con cualquier carácter alfanumérico, incluyendo el guión bajo. Equivalente a [A-Za-z0-9_].

Por ejemplo, /\w/ coincide con 'a' en "apple," '5' en "$5.28," y '3' en "3D."

\W

Coincide con todo menos caracteres de palabra. Equivalente a [^A-Za-z0-9_].

Por ejemplo, /\W//[^A-Za-z0-9_]/ coinciden con '%' en "50%."

\n

Cuando n es un entero positivo, es una referencia hacia alguna subcadena de paréntesis dentro de la misma expresion que coincida con el número (contando los paréntesis izquierdos).

Por ejemplo, /apple(,)\sorange\1/ coincide con 'apple, orange,' en "apple, orange, cherry, peach."

\0 Coincide con el carácter NULL (U+0000). No preseda este por otro número, ya que \0<numero> se considera una secuencia octal escapada.
\xhh Coincide con un carácter en exadecimal hh (dos dígitos hexadecimales)
\uhhhh Coincide con un carácter unicode con el código hhhh (cuatro dígitos hexadecimales).


"Escapar" la entrada del usuario para que sea tratada como una cadena literal en una expresión regular se puede lograr mediante la sustitución simple:

function escapeRegExp(cadena) {
return cadena.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& significa la totalidad de la cadena coincidente
}

JavaScript, expresiones regulares
Sintaxis de un patrón de expresión regular

Uso de paréntesis

Los paréntesis alrededor de alguna parte del patrón de la expresión regular hacen que parte de la subcadena que coincida sea recordada. Una vez recordada, puede ser rellamada en otro uso.

Por ejemplo, el patrón /Capítulo (\d+)\.\d*/ ilustra caracteres de escape y especiales adicionales e indica que parte del patrón debe recordarse. Coincide con los caracteres 'Capítulo ' seguidos por uno o más números, luego un punto decimal, seguido por cualquier número 0 o más veces. Además, se utilizaron paréntesis para recordar el primer grupo de números.

Este patrón se encuentra dentro de la cadena "Capítulo 4.3, párrafo 6" y se memoriza el '4'. El patrón no se encuentra en "Capítulo 3 y 4", porque no tiene el punto después del '3'.

Si no se quiere memorizar la subcadena, se utilizará ?: al inicio de los paréntesis. Por ejemplo, (?:\d+) coincide con uno o más números pero no memoriza la coincidencia.

JavaScript, expresiones regulares
Sintaxis de un patrón de expresión regular

Uso de expresiones regulares<br>
Las expresiones regulares se utilizan con los métodos de RegExp test y exec y con los metodos de String match, replace, search, and split.

Métodos que utilizan expresiones regulares
Método Descripción
exec Un método RegExp que ejecuta una búsqueda por una coincidencia en una cadena. Devuelve un array de información.
test Un método RegExp que verifica una coincidencia en una cadena. Devuelve true o false.
match Un método String que ejecuta una búsqueda por una coincidencia en una cadena. Devuelve un array de información o null si no existe coincidencia alguna.
search Un método String que verifica una coincidencia en una cadena. Devuelve el índice de la coincidencia, o -1 si la búsqueda falla.
replace Un método String que ejecuta una búsqueda por una coincidencia en una cadena, y reemplaza la subcadena encontrada con una subcadena de reemplazo.
split Un método String que utiliza una expresión regular o una cadena fija para cortar una cadena y colocarlo en un array de subcadenas.

JavaScript, expresiones regulares
Sintaxis de un patrón de expresión regular

Búsqueda Avanzada Con 'Banderas' (Flags)

Las expresiones regulares tienen cuatro banderas opcionales que permiten realizar búsquedas globales y sin distinción de mayúsculas y minúsculas. Estas banderas pueden utilizarse por separado o juntas y en cualquier orden; y se incluyen como parte de la expresión regular.
Indicadores de expresiones regulares.
Bandera Descripción
g Búsqueda global.
i Búsqueda 'case-insensitive' (no sensible a mayúsculas).
m Búsqueda en multi-línea.
u unicode; se trata el patrón como una secuencia de caracteres unicode.
y Realizar una búsqueda "pegajosa" que se ajuste a partir de la posición actual en la cadena de destino. Ver sticky


Sintaxis:

var re = /patrón/flags;

o

var re = new RegExp('patrón', 'banderas');

Ejemplo, re = /\w+\s/g crea una expresión regular que busca uno o más caracteres seguidos por un espacio; y busca esta combinación en la totalidad de la cadena.

var re = /\w+\s/g;
var str = "fee fi fo fum";
var myArray = str.match(re);
console.log (myArray);
//["fee ", "fi ", "fo "]


Donde se puede reemplazar la línea:

var re = /\w+\s/g;

con

var re = new RegExp("\\w+\\s","g")

JavaScript, expresiones regulares
Consejos de uso

Recomendaciones

- Las expresiones regulares buscan patrones.

var er=/hola/;
er.test(“abcaholaabc”); // true


- Habitualmente interesa que una cadena completa cumpla un patrón. Se utilizaran los caracteres especiales ^ y $ para delimitar el principio y fin del patrón.

var er=/^hola$/;
er.test(“abcaholaabc”); // false


- Hay que llevar cuidado con los caracteres especiales al definir las expresiones. Se utiliza el carácter de escape “\” /^\w+\.\w*$/ -> uno o más caracteres alfanuméricos que incluyen un “.”

- No se pueden definir rangos numéricos.

/^[12-40]$/ -> “1”, “2”, “3”, “4” ó “0”. En el patrón, 2-4 define un rango de caracteres.

Búsquedas en UMU


-->