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 son utilizados a través de 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 siguientes dos maneras:

  • Utilizando una representación literal de la expresión:
    var re = /ab+c/;
    

    La representación literal compila la expresión regular una vez que el script ha terminado de cargar. Es recomendable utilizar esta representación cuando la expresión regular permanecerá sin cambios durante la ejecución del script, puesto que ofrece un mejor desempeño.

  • Constructor del objeto RegExp:
    var re = new RegExp("ab+c");
    

    El uso del constructor ofrece una compilación de la expresión regular en tiempo de ejecución. Su uso es recomendable en aquellos escenarios en que el patrón de la expresión regular pueda cambiar durante la ejecución del script, o bien, se desconoce el patrón, dado que se obtiene desde otra fuente, cuando es suministrado por el usuario, por ejemplo.

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, los cuales 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 Using Parenthesized Substring Matches.

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 "Hi, do you know your abc's?" y "The latest airplane designs evolved from slabcraft." En ambos existe una coincidencia exacta con la subcadena 'abc'. No hay coincidencia en la cadena 'Grab crab' debido a que, a pesar de que contiene los caracteres 'a', 'b' y 'c', la sequencia 'abc' nunca aparece.

Utilizando caracteres especiales

Cuando la búsqueda de coincidencia require 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 sequencia de caracteres en la cual una 'a' preceda a cualquier cantidad de 'b' (cero o más) 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.

Tabla 4.1 Caracteres especiales para expresiones regulares.
Caracter Significado
\

Buscará coincidencias conforme a las siguientes reglas:

Una barra invertida precediendo un caracter simple indica que éste debe ser interpretado como un caracter 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 caracter en específico, representará el delimitador especial de palabras.

Una barra invertida que precede a un caracter especial indica que éste deberá ser interpretado literalmente, esto es, como un caracter simple y no como un caracter 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 caracter especial es interpretado como un caracter simple, y cadenas como 'a*' harán coincidencia.

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

^ Coincide con el principio de la entrada. Si la 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 caracter '^' tiene un significado diferente cuando aparece como el primer caracter en un patrón. Véase patrones complementarios para mayores detalles y ejemplos.
$

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

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

*

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

Por ejemplo, la expresión /bo*/ encontrará la subcadena 'boooo' en la cadena "A ghost booooed" y el caracter 'b' en la cadena "A bird warbled", pero no encontrará nada en la cadena "A goat grunted".

+

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

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

? Busca el caracter 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 "angle" y también el caracter 'l' en la cadena "oslo".

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 caracter "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 caracter excepto un caracter de nueva linea.

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

(x)

Busca 'x' y recuerda la busqueda, como el siguiente ejemplo lo muestra. Los parentesis son llamados parentesis de captura

El '(foo)' y '(bar)' en el patron  /(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 coincida las dos últimas palabras de la cadena. Nota 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' ).

(?: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'.

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

{n} Coincide exactamente con n ocurrencias de la expreció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 expreció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 caracter 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, [^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 posicion entre donde un caracter de palabra no viene precedido o seguido por otro. Notese 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 caracter 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 caracter de palabra;
/\w\b\w/ no coincidirá con nada, porque un caracter de palabra no puede estar seguido por ambos, un limite y un caracter de palabra.

\B

Coincide con un no-limite de palabra. Esto coincide con una posicion donde el anterior y el siguiente caracter 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./ matches 'ye' in "possibly yesterday."

\cX

Donde X es un caracter entre A y Z. Coincide con un caracter de control en un string.

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

\d

Coincide con un caracter 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 caracter 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 caracter de espacio, entreellos 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\w*/ coincide con 'foo' en "foo bar."

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

Coincide con cualquier caracter 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 parentesis dentro de la misma expresion que coincida con el número (contando los parentesis izquierdos).

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

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

Escaping user input to be treated as a literal string within a regular expression can be accomplished by simple replacement:

function escapeRegExp(string){
  return string.replace(/([.*+?^${}()|\[\]\/\\])/g, "\\$1");
}

Usando parentesis

Los parentesis alrededor de alguna parte del patron de la expresión regular causa 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 parentesis para recordar el primer grupo de números.

Este patrón se encuentra dentro del string "Open Chapter 4.3, paragraph 6" y se memoriza el '4'. El patrón no se encuentra en "Chapter 3 and 4", porque no consigue el punto despues del '3'.

Si no quiere memorizar la subcadena, utilice ?: al inicio de los parentesis. 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.

Tabla 4.2 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.

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 de ejecución más lenta) utilice los métodos exec o match. Si usted utiliza exec o match y si se logra la coincidencia, estos métodos devuelven un array y actualiza 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 un string.

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");

Si quiere construir la expresión regular desde un String, otra alternativa es:

var myRe = new RegExp("d(b+)d", "g");
var myArray = myRe.exec("cdbbdbsbz");

Todos los ejemplos tienen coincidencias, se retorna un array, y se actualizan las propiedades mostradas en la siguiente tabla.

Tabla 4.3 Resultados de la ejecución de la expresión regular.
Objeto Propiedad o indice Descripción En el ejemplo
myArray   Las coincidencias y las subcadenas memorizadas. ["dbbd", "bb"]
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 lastIndex La posición de donde iniciar la próxima busqueda. (Esta propiedad solo es seteada si la expreción utiliza la opcion 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"

As shown in the second form of this example, you can use a regular expression created with an object initializer without assigning it to a variable. If you do, however, every occurrence is a new regular expression. For this reason, if you use this form without assigning it to a variable, you cannot subsequently access the properties of that regular expression. For example, assume you have this script:

var myRe = /d(b+)d/g;
var myArray = myRe.exec("cdbbdbsbz");
console.log("The value of lastIndex is " + myRe.lastIndex);

This script displays:

The value of lastIndex is 5

However, if you have this script:

var myArray = /d(b+)d/g.exec("cdbbdbsbz");
console.log("The value of lastIndex is " + /d(b+)d/g.lastIndex);

It displays:

The value of lastIndex is 0

The occurrences of /d(b+)d/g in the two statements are different regular expression objects and hence have different values for their lastIndex property. If you need to access the properties of a regular expression created with an object initializer, you should first assign it to a variable.

Using Parenthesized Substring Matches

Including parentheses in a regular expression pattern causes the corresponding submatch to be remembered. For example, /a(b)c/ matches the characters 'abc' and remembers 'b'. To recall these parenthesized substring matches, use the Array elements [1], ..., [n].

The number of possible parenthesized substrings is unlimited. The returned array holds all that were found. The following examples illustrate how to use parenthesized substring matches.

Example 1

The following script uses the replace() method to switch the words in the string. For the replacement text, the script uses the $1 and $2 in the replacement to denote the first and second parenthesized substring matches.

var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
console.log(newstr);

This prints "Smith, John".

Advanced Searching With Flags

Regular expressions have four optional flags that allow for global and case insensitive searching. These flags can be used separately or together in any order, and are included as part of the regular expression.

Table 4.4 Regular expression flags.
Flag Description
g Global search.
i Case-insensitive search.
m Multi-line search.
y Perform a "sticky" search that matches starting at the current position in the target string.

Nota sobre Firefox 3

Support for the y flag was added in Firefox 3. The y flag fails if the match doesn't succeed at the current position in the target string.

To include a flag with the regular expression, use this syntax:

var re = /pattern/flags;

or

var re = new RegExp("pattern", "flags");

Note that the flags are an integral part of a regular expression. They cannot be added or removed later.

For example, re = /\w+\s/g creates a regular expression that looks for one or more characters followed by a space, and it looks for this combination throughout the string.

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

This displays ["fee ", "fi ", "fo "]. In this example, you could replace the line:

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

with:

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

and get the same result.

The m flag is used to specify that a multiline input string should be treated as multiple lines. If the m flag is used, ^ and $ match at the start or end of any line within the input string instead of the start or end of the entire string.

Examples

The following examples show some uses of regular expressions.

Changing the Order in an Input String

The following example illustrates the formation of regular expressions and the use of string.split() and string.replace(). It cleans a roughly formatted input string containing names (first name first) separated by blanks, tabs and exactly one semicolon. Finally, it reverses the name order (last name first) and sorts the list.

// The name string contains multiple spaces and tabs,
// and may have multiple spaces between first and last names.
var names = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ; Chris Hand ";

var output = ["---------- Original String\n", names + "\n"];

// Prepare two regular expression patterns and array storage.
// Split the string into array elements.

// pattern: possible white space then semicolon then possible white space
var pattern = /\s*;\s*/;

// Break the string into pieces separated by the pattern above and
// store the pieces in an array called nameList
var nameList = names.split(pattern);

// new pattern: one or more characters then spaces then characters.
// Use parentheses to "memorize" portions of the pattern.
// The memorized portions are referred to later.
pattern = /(\w+)\s+(\w+)/;

// New array for holding names being processed.
var bySurnameList = [];

// Display the name array and populate the new array
// with comma-separated names, last first.
//
// The replace method removes anything matching the pattern
// and replaces it with the memorized string—second memorized portion
// followed by comma space followed by first memorized portion.
//
// The variables $1 and $2 refer to the portions
// memorized while matching the pattern.

output.push("---------- After Split by Regular Expression");

var i, len;
for (i = 0, len = nameList.length; i < len; i++){
  output.push(nameList[i]);
  bySurnameList[i] = nameList[i].replace(pattern, "$2, $1");
}

// Display the new array.
output.push("---------- Names Reversed");
for (i = 0, len = bySurnameList.length; i < len; i++){
  output.push(bySurnameList[i]);
}

// Sort by last name, then display the sorted array.
bySurnameList.sort();
output.push("---------- Sorted");
for (i = 0, len = bySurnameList.length; i < len; i++){
  output.push(bySurnameList[i]);
}

output.push("---------- End");

console.log(output.join("\n"));

Using Special Characters to Verify Input

In the following example, the user is expected to enter a phone number. When the user presses the "Check" button, the script checks the validity of the number. If the number is valid (matches the character sequence specified by the regular expression), the script shows a message thanking the user and confirming the number. If the number is invalid, the script informs the user that the phone number is not valid.

Within non-capturing parentheses (?: , the regular expression looks for three numeric characters \d{3} OR | a left parenthesis \( followed by three digits \d{3}, followed by a close parenthesis \), (end non-capturing parenthesis )), followed by one dash, forward slash, or decimal point and when found, remember the character ([-\/\.]), followed by three digits \d{3}, followed by the remembered match of a dash, forward slash, or decimal point \1, followed by four digits \d{4}.

The Change event activated when the user presses Enter sets the value of 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}/;  
      function testInfo(phoneInput){  
        var OK = re.exec(phoneInput.value);  
        if (!OK)  
          window.alert(RegExp.input + " isn't a phone number with area code!");  
        else
          window.alert("Thanks, your phone number is " + OK[0]);  
      }  
    </script>  
  </head>  
  <body>  
    <p>Enter your phone number (with area code) and then click "Check".
        <br>The expected format is like ###-###-####.</p>
    <form action="#">  
      <input id="phone"><button onclick="testInfo(document.getElementById('phone'));">Check</button>
    </form>  
  </body>  
</html>

Etiquetas y colaboradores del documento

 Última actualización por: wffranco,