Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del inglés.
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 los métodos exec
y test
de RegExp
, así como los métodos match
, replace
, search
y split
de String
. En este capítulo se describe el uso y funcionamiento de las expresiones regulares en JavaScript.
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, como a continuación:
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
, como a continuación: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. Utilice la función constructora cuando sepa que el patrón de la expresión regular cambiará, o cuando desconozca el patrón y deba obtenerlo de otra fuente, como por ejemplo del usuario.
Escribiendo un patrón de expresión regular
Un patrón de expresión regular se compone de caracteres simples, como /abc/
, o una combinación de caracteres simples y especiales, como /ab*c/
o /Chapter (\d+)\.\d*/
. El segundo ejemplo 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, como se describe en Usando coincidencias de subcadenas entre paréntesis.
Utilizando 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 exacta secuencia y orden de caracteres 'abc'. Tal expresión tendría resultados en las cadenas "Hola, ¿conoces tu abc?" y "Los últimos diseños de aviones evolucionaron desde slabcraft." En ambos existe una coincidencia exacta con la subcadena 'abc'. Sin embargo, no habría coincidencia en la cadena 'Nayab calló' debido a que, a pesar de que contiene los caracteres 'a', 'b' y 'c', la secuencia exacta 'abc' nunca aparece.
Utilizando 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' (*
significa 0 o más ocurrencias del elemento precedente) y sea inmediatamente seguida por una 'c'. En la cadena 'cbbabbbbcdebc,' el patrón coincidirá con la subcadena 'abbbbc'.
La siguiente tabla ofrece una lista completa de los caracteres especiales que pueden utilizarse en las expresiones regulares.
carácter | Significado |
---|---|
\ |
Buscará coincidencias conforme a las siguientes reglas: |
^ |
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 Por ejemplo, la expresión |
* |
Busca el carácter precedente 0 (cero) o más veces. Es equivalente a {0,}. Por ejemplo, la expresión |
+ |
Busca el carácter precedente 1 o más veces. Es equivalente a {1,}. Por ejemplo, la expresión |
? |
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 , |
(x) |
Busca 'x' y recuerda la búsqueda, como muestra el siguiente ejemplo. Los paréntesis son llamados paréntesis de captura. |
(?: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'. Para mayor información, mira Usando paréntesis mas abajo en este artículo. |
x(?=y) |
Coincide con 'x' sólo si 'x' es seguida por 'y'. Esto se denomina previsión (lookahead, mirar adelante). Por ejemplo, |
x(?!y) |
Coincide con 'x' solo si 'x' no es seguida por 'y'. Es una previsión negativa. Por ejemplo, |
x|y |
Coincide con 'x' o 'y' (si no hay coincidencias para 'x'). Por ejemplo, |
{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 Por ejemplo, |
[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.]+/ y /[\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, |
[\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 Ejemplos: 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, |
\cX |
Donde X es un carácter entre A y Z. Coincide con un carácter de control en un string. Por ejemplo, |
\d |
Coincide con un carácter de número. Equivalente a Por ejemplo, |
\D |
Coincide con cualquier carácter no numérico. Equivalente a Por ejemplo, |
\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 Por ejemplo, |
\S |
Coincide con todo menos caracteres de espacio. Equivalente a Por ejemplo, |
\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 Por ejemplo, |
\W |
Coincide con todo menos caracteres de palabra. Equivalente a Por ejemplo, |
\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, |
\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:
función escapeRegExp(cadena) {
return cadena.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& significa la totalidad de la cadena coincidente
}
Usando 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, como se describe en Using Parenthesized Substring Matches.
Por ejemplo, el patrón /Chapter (\d+)\.\d*/
ilustra caracteres de escape y especiales adicionales e indica que parte del patrón debe recordarse. Coincide con los caracteres 'Chapter ' seguidos por uno o más números, luego un punto decimal, seguido por cualquier número 0 o más veces (para más detalles vea la tabla 4.1). Además, se utilizaron paréntesis para recordar el primer grupo de números.
Este patrón se encuentra dentro de la cadena "Open Chapter 4.3, paragraph 6" y se memoriza el '4'. El patrón no se encuentra en "Chapter 3 and 4", porque no tiene el punto despues del '3'.
Si no quiere memorizar la subcadena, utilice ?:
al inicio de los paréntesis. Por ejemplo, (?:\d+)
coincide con uno o más números pero no memoriza la coincidencia.
Trabajando con Expresiones Regulares
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
. Estos métodos son explicados en la Referencia JavaScript.
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. |
Cuando quiera saber si un patrón se encuentra en una cadena, utilice los métodos test
o search
. Para obtener más información (pero ejecución más lenta) utilice los métodos exec
o match
. Si usted utiliza exec
o match
y se logra la coincidencia, estos métodos devuelven un array y actualizan las propiedades del objeto de la expresión regular asociada y también aquellas del objeto de la expresión regular predefinida, RegExp
. Si la coincidencia falla, el método exec
devuelve null
(que coacciona a false
).
En el siguiente ejemplo, el script usa el método exec
para buscar coincidencias en una cadena.
var myRe = /d(b+)d/g; var myArray = myRe.exec('cdbbdbsbz');
Si no necesita acceder a las propiedades de la expresión regular, una forma alternativa de crear myArray
es con este script:
var myArray = /d(b+)d/g.exec('cdbbdbsbz'); // equivalente a "cdbbdbsbz".match(/d(b+)d/g)
Si quiere construir la expresión regular a partir de una cadena, otra alternativa es:
var myRe = new RegExp('d(b+)d','g'); var myArray = myRe.exec('cdbbdbsbz');
Todos estos ejemplos tienen coincidencias, por lo que se retorna un array, y se actualizan las propiedades mostradas en la siguiente tabla.
Objeto | Propie-dad o indice | Descripción | En el ejemplo |
---|---|---|---|
my Array |
Las coincidencias y las subcadenas memorizadas. | ['dbbd', 'bb', index: 1, input: 'cdbbdbsbz'] |
|
index |
La posición de la coincidencia en la cadena de entrada. | 1 |
|
input |
La cadena original. | "cdbbdbsbz" |
|
[0] |
La última coincidencia de caracteres. | "dbbd" |
|
myRe |
last Index |
La posición de donde iniciar la próxima búsqueda. (Esta propiedad solo activa si la expresión utiliza la opción g, descrita en Advanced Searching With Flags.) |
5 |
source |
El texto del patrón. Actualizado al momento de creación, no al ejecutarse. | "d(b+)d" |
Como puede verse en la segunda línea de este ejemplo, puede usar una expresión regular creada con un inicializador de objeto sin asignarse a una variable. Si lo hace, sin embargo, cada ocurrencia será una nueva expresión regular. Por esta razón, si usa este método sin asignarlo a una variable, no podrá acceder posteriormente a las propiedades de estas expresiones regulares. Por ejemplo, suponga que tiene el siguiente script:
var myRe = /d(b+)d/g; var myArray = myRe.exec ( "cdbbdbsbz"); console.log ( "El valor de lastIndex es" + myRe.lastIndex);
El script mostrará:
El valor de lastIndex es 5
Sin embargo, si el script utilizado es éste:
var myArray = /d(b+)d/g.exec("cdbbdbsbz "); console.log ( "El valor de lastIndex es" + /d(b+)d/g.lastIndex);
Se mostrará lo siguiente:
El valor de lastIndex es 0
Las apariciones de /d(b+)d/g
en las dos sentencias son objetos de expresiones regulares distintas y, por lo tanto, tienen diferentes valores en su propiedad lastIndex
. Si necesita acceder a las propiedades de una expresión regular creada con un inicializador de objeto, deberá, previamente, asignarla a una variable.
Usar coincidencias de subcadenas entre paréntesis
Incluir paréntesis, en un patrón de expresión regular hace que el subcoincidencia correspondiente para ser recordado. Por ejemplo, /a(b)c/
partidos 'ABC' recuerda a los personajes y 'b'. Para recuperar estos partidos subcadena entre paréntesis, utilizar los Array
elementos [1]
, ..., [n]
.
El número de posibles subcadenas entre paréntesis es ilimitado. La matriz devuelta contiene todo lo que se encuentra. Los siguientes ejemplos ilustran cómo utilizar coincidencias de subcadenas entre paréntesis.
Ejemplo 1
El siguiente script usa el método replace()
para intercambiar palabras en el string. Para el texto de reemplazo, el script utiliza $1
y $2
en el reemplazo para denotar la primera y segunda coincidencias de subcadena entre ubicadas entre paréntesis.
var re = /(\w+)\s(\w+)/; var str = "John Smith"; var newstr = str.replace (re, '$2, $1'); console.log (newstr);
Esto devuelve "Smith, John".
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.
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. Vea sticky |
Para incluir una bandera con la expresión regular, se usa la siguiente sintaxis:
var re = /patrón/flags;
o
var re = new RegExp('patrón', 'banderas');
Nótese que las banderas son una parte integral de la expresión regular. No se pueden agregar o eliminar a posteriori.
Por 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 del string.
var re = /\w+\s/g; var str = "fee fi fo fum"; var myArray = str.match(re); console.log (myArray); //["fee ", "fi ", "fo "]
En este ejemplo, puede reemplazar la línea:
var re = /\w+\s/g;
con:
var re = new RegExp("\\w+\\s","g");
y obtener el mismo resultado.
El comportamiento asociado con la bandera 'g
' es diferente cuando se utiliza el método .exec()
. (Los roles de "clase" y "argumento" se invierten: En el caso de .match()
, la cadena clase (o tipo de dato) posee el método y la expresión regular es solo un argumento, mientras que en el caso de .exec()
, es la expresión regular la que posee el método, con la cadena como argumento. Contrasta str.match(re)
con re.exec(str)
.) La bandera 'g
' se emplea en el método .exec()
para obtener una progresión iterativa.
var xArray; while(xArray = re.exec(str)) console.log(xArray);
// produce:
// ["fee ", index: 0, input: "fee fi fo fum"]
// ["fi ", index: 4, input: "fee fi fo fum"]
// ["fo ", index: 7, input: "fee fi fo fum"]
La bandera m
se usa para especificar que una entrada de cadena multilineal se debe tratar como varias líneas independientes. Si se utiliza m
, ^
y $
actuarán al inicio y final de cada línea dentro de la cadena de entrada en vez de al inicio y final de la cadena completa.
Ejemplos
Los siguientes ejemplos muestran algunos usos de las expresiones regulares:
Cambio del orden de una cadena de entrada
El siguiente ejemplo ilustra la formación de expresiones regulares y el uso de string.split()
y string.replace()
. Se limpia una cadena de entrada más o menos con formato que contiene los nombres (nombre primero) separados por espacios en blanco, pestañas y exactamente un punto y coma. Por último, se invierte el orden de los nombres (apellido primero) y ordena la lista.
// La cadena de nombre contiene múltiples espacios y las pestañas, // y puede tener múltiples espacios entre nombres y apellidos. nombres var = "Harry Trump; Fred Barney; Helen Rigby; Bill Abel; Chris Hand"; salida var = [ "---------- original de cadena \n", nombres + "\n"]; // Preparar dos patrones de expresión regular y de almacenamiento de matrices. // Dividir la cadena en elementos de la matriz. // patrón: posible espacio en blanco a continuación, punto y coma entonces posible espacio en blanco var pattern = /\s*;\s*/; // Romper la cadena en piezas separadas por el patrón de arriba y // almacenar las piezas en una matriz llamada NAMELIST var NAMELIST = names.split (patrón); // nuevo patrón: uno o más caracteres luego espacios luego caracteres. // utilizar paréntesis para "memorizar" porciones del patrón. // Las porciones memorizados se denominan más adelante. pattern = /(\w +)\s+(\w+)/; // Nueva variedad de nombres que sostienen está procesando. era bySurnameList = []; // Muestra la matriz nombre y poblar la nueva matriz // con nombres separados por comas, durar primero. // // El método replace quita nada que coincida con el patrón // y lo sustituye por la parte memorizado memorizado cadena segundos // seguido de espacio coma seguida de porción primera memorizado. // // Las variables $1 y $2 se refieren a las porciones // memorizado mientras que coincida con el patrón. output.push ( "---------- Después de Split por expresiones regulares"); var i, len; for (i = 0, len = nameList.length; i <len; i ++) { output.push (NAMELIST [i]); bySurnameList [i] = NAMELIST [i] .replace (pattern, '$2, $1'); } // Mostrar la nueva matriz. output.push ( "---------- Nombres Invertidos"); for (i = 0, len = bySurnameList.length; i <len; i ++) { output.push (bySurnameList [i]); } // Ordenar por apellido, a continuación, mostrar la matriz ordenada. bySurnameList.sort(); output.push ( "---------- Ordenada"); for (i = 0, len = bySurnameList.length; i <len; i ++) { output.push (bySurnameList[i]); } output.push ( "---------- Fín"); console.log (output.join ( "\n"));
Uso de caracteres especiales para Verificar entrada
En el siguiente ejemplo, se espera que el usuario introduzca un número de teléfono. Cuando el usuario pulsa el botón "Check", la secuencia de comandos comprueba la validez del número. Si el número es válido (coincide con la secuencia de caracteres especificados por la expresión regular), el guión muestra un mensaje agradeciendo el usuario y confirmar el número. Si el número no es válido, la secuencia de comandos informa al usuario de que el número de teléfono no es válido.
Dentro de no capturar paréntesis (?:
, la expresión regular se ve por tres caracteres numéricos \d{3}
O |
un paréntesis izquierdo \(
seguido de tres dígitos \d{3}
, seguido de un paréntesis de cierre \)
, (extremo no capturar paréntesis )
), seguido por una raya, barra inclinada, o punto decimal y cuando encontrado, recuerda el carácter ([-\/\.])
, seguido por tres dígitos \d{3}
, seguido por el partido recordado de un guión, barra inclinada, o punto decimal \1
, seguido de cuatro dígitos \d{4}
.
El Change
evento activa cuando el usuario pulsa Intro establece el valor de RegExp.input
.
<!DOCTYPE html> <html> <head> <meta http-equiv = "Content-Type" content = "text / html; charset = ISO-8859-1"> <meta http-equiv = "Content-Script-Type" content = "text / javascript"> <script type = "text/javascript"> var re = /(?:\d{3}|\(\d{3}\))([-\/\.])\d{3}\1\d{4}/; función testInfo (phoneInput) { var OK = re.exec (phoneInput.value); if (!OK) window.alert(RegExp.input + "no es un número de teléfono con código de área!"); más window.alert("Gracias, su número de teléfono es" + OK[0]); } </script> </head> <body> <P> Introduzca su número de teléfono (con el código de área) y haga clic en "Check". Francia El formato esperado es como ###-###-####. </ p> <form action = "#"> <button onclick = "testInfo (document.getElementById ( 'teléfono'));"> <input id = "teléfono"> Verificar </ button> </ form> </ fody> </ html>