RegExp

El objeto RegExp se utiliza para hacer coincidir texto con un patrón.

Para obtener una introducción a las expresiones regulares, lee el capítulo sobre expresiones regulares en la Guía de JavaScript.

Descripción

Notación literal y constructor

Hay dos formas de crear un objeto RegExp: una notación literal y un constructor.

  • Los parámetros de la notación literal se encierran entre barras y no utilizan comillas.
  • Los parámetros de la función constructora no se encierran entre barras, pero utilizan comillas.

Las siguientes tres expresiones crean el mismo objeto de expresión regular:

let er = /ab+c/i; // notación literal
let er = new RegExp('ab+c', 'i') // constructor con patrón de cadena como primer argumento
let er = new RegExp(/ab+c/, 'i') // constructor con expresión regular literal como primer argumento (a partir de ECMAScript 6)

La notación literal da como resultado la compilación de la expresión regular cuando se evalúa la expresión. Utiliza la notación literal cuando la expresión regular permanecerá constante. Por ejemplo, si usas notación literal para construir una expresión regular usada en un bucle, la expresión regular no se volverá a compilar en cada iteración.

El constructor del objeto de expresión regular, por ejemplo, new RegExp('ab+c'), da como resultado la compilación en tiempo de ejecución de la expresión regular. Utiliza la función constructora cuando sepas que el patrón de expresión regular cambiará, o no conozcas el patrón y lo obtienes de otra fuente, tal como la entrada del usuario.

Banderas en el constructor

A partir de ECMAScript 6, new RegExp(/ab+c/, 'i') ya no arroja un TypeError ("no puedes proporcionar banderas cuando construyes una expresión regular a partir de otra") cuando el primer argumento es una RegExp y el segundo argumento flags está presente. En su lugar, se crea una nueva RegExp a partir de los argumentos.

Cuando se utiliza la función constructora, las reglas de escape de cadenas normales (antes de los caracteres especiales con \ cuando se incluyen en una cadena) son necesarias.

Por ejemplo, los siguientes son equivalentes:

let er = /\w+/
let er = new RegExp('\\w+')

Propiedades de expresiones regulares similares a Perl

Ten en cuenta que varias de las propiedades de RegExp tienen nombres largos y cortos (tipo Perl). Ambos nombres siempre se refieren al mismo valor. (Perl es el lenguaje de programación a partir del cual JavaScript modeló sus expresiones regulares). Consulta también las propiedades en desuso de RegExp

Constructor

RegExp()
Crea un nuevo objeto RegExp.

Propiedades estáticas

get RegExp[@@species]
La función constructora utilizada para crear objetos derivados.
RegExp.lastIndex
El índice en el que comenzará la siguiente búsqueda.

Propiedades de la instancia

RegExp.prototype.flags
Una cadena que contiene las banderas del objeto RegExp.
RegExp.prototype.dotAll
Si el "." coincide con nuevas líneas o no.
RegExp.prototype.global
Si se debe probar o no la expresión regular con todas las posibles ocurrencias en una cadena, o solo con la primera.
RegExp.prototype.ignoreCase
Si se deben o no ignorar las mayúsculas/minúsculas al buscar en una cadena.
RegExp.prototype.multiline
Si buscar o no en cadenas multilínea.
RegExp.prototype.source
El texto del patrón.
RegExp.prototype.sticky
Si la búsqueda es pegajosa o no.
RegExp.prototype.unicode
Si las funciones Unicode están habilitadas o no.

Métodos de instancia

RegExp.prototype.compile()
(Re)compila una expresión regular durante la ejecución de un script.
RegExp.prototype.exec()
Ejecuta una búsqueda de una coincidencia en su parámetro de cadena.
RegExp.prototype.test()
Prueba una coincidencia en su parámetro de cadena.
RegExp.prototype.toString()
Devuelve una cadena que representa el objeto especificado. Redefine el método Object.prototype.toString().
RegExp.prototype[@@match]()
Realiza la coincidencia con la cadena dada y devuelve el resultado de la coincidencia.
RegExp.prototype[@@matchAll]()
Devuelve todas las coincidencias de la expresión regular con una cadena.
RegExp.prototype[@@replace]()
Reemplaza las coincidencias en una cadena dada con una nueva subcadena.
RegExp.prototype[@@search]()
Busca la coincidencia en la cadena dada y devuelve el índice del patrón encontrado en la cadena.
RegExp.prototype[@@split]()
Divide la cadena dada en un arreglo separando la cadena en subcadenas.

Ejemplos

Usar una expresión regular para cambiar el formato de los datos

El siguiente script usa el método replace() de la instancia String para hacer coincidir una nombre en el formato primero último y enviarlo en el formato último, primero.

En el texto de reemplazo, el script usa $1 y $2 para indicar los resultados de los correspondientes paréntesis coincidentes en el patrón de expresión regular.

let er = /(\w+)\s(\w+)/
let str = 'John Smith'
let newstr = str.replace(er, '$2, $1')
console.log(newstr)

Esto muestra "Smith, John".

Uso de expresiones regulares para dividir líneas con diferentes finales de línea/saltos de línea

El final de línea predeterminado varía según la plataforma (Unix, Windows, etc.). La división de líneas proporcionada en este ejemplo funciona en todas las plataformas.

let texto = 'Un poco de texto\ny un poco más\r\ny aún\reste es el final'
let lineas = texto.split(/\r\n|\r|\n/)
console.log(lineas) // logs [ 'Un poco de texto', 'y un poco más', 'y aún', 'este es el final' ]

Ten en cuenta que el orden de los patrones en la expresión regular es importante.

Usar expresiones regulares en varias líneas

let s = '¡Por favor, sí\nhazme el día!'

s.match(/sí.*día/);
// Devuelve null

s.match(/sí[^]*día/);
// Devuelve ["sí\nhazme el día"]

Usar una expresión regular con la bandera pegajosa

La bandera sticky indica que la expresión regular realiza una coincidencia permanente en la cadena de destino al intentar hacer coincidir a partir de RegExp.prototype.lastIndex.

let str = '#foo#'
let regex = /foo/y

regex.lastIndex = 1
regex.test(str)      // true
regex.lastIndex = 5
regex.test(str)      // false (lastIndex se tiene en cuenta con una bandera pegajosa)
regex.lastIndex      // 0 (restablecer después de un error de coincidencia)

La diferencia entre la bandera pegajosa y la bandera global

Con la bandera pegajosa y, la siguiente coincidencia tiene que ocurrir en la posición lastIndex, mientras que con la bandera global g, la coincidencia puede ocurrir en la posición lastIndex o posterior:

er = /\d/y;
while (r = re.exec("123 456")) console.log(r, "Y er.lastIndex", er.lastIndex);

// [ '1', index: 0, input: '123 456', groups: undefined ] AND er.lastIndex 1
// [ '2', index: 1, input: '123 456', groups: undefined ] AND er.lastIndex 2
// [ '3', index: 2, input: '123 456', groups: undefined ] AND er.lastIndex 3
//   ... y no más coincidencias.

Con la bandera global g, coincidirían los 6 dígitos, no solo 3.

Expresión regular y caracteres Unicode

\w y \W solo coincide con caracteres basados en ASCII; por ejemplo, a a z, A a Z, 0 a 9 y _.

Para hacer coincidir caracteres de otros idiomas como Cirílico o Hebreo, usa \uhhhh, donde hhhh es el Valor Unicode en hexadecimal.

Este ejemplo demuestra cómo se pueden separar los caracteres Unicode de una palabra.

let texto = 'Образец texto на русском языке'
let regex = /[\u0400-\u04FF]+/g

let match = regex.exec(text)
console.log(match[0])        // registra 'Образец'
console.log(regex.lastIndex) // registra '7'

let match2 = regex.exec(texto)
console.log(match2[0])       // registra 'на' [no registró 'texto']
console.log(regex.lastIndex) // registra '15'

// y así sucesivamente

La función Escapes de propiedad Unicode presenta una solución, al permitir una declaración tan simple como \p{scx=Cyrl}.

Extraer el nombre de subdominio de la URL

let url = 'http://xxx.dominio.com'
console.log(/[^.]+/.exec(url)[0].substr(7)) // registra 'xxx'

En lugar de utilizar expresiones regulares para analizar las URL, normalmente es mejor utilizar el analizador de URL integrado en los navegadores mediante la API URL.

Especificaciones

Especificación
ECMAScript (ECMA-262)
La definición de 'RegExp' en esta especificación.

Compatibilidad del navegador

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome para AndroidFirefox para AndroidOpera para AndroidSafari en iOSSamsung InternetNode.js
RegExpChrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 4Opera Soporte completo 5Safari Soporte completo 1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
RegExp() constructorChrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 4Opera Soporte completo 5Safari Soporte completo 1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
compile
Deprecado
Chrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 4Opera Soporte completo 6Safari Soporte completo 3.1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 2Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
dotAllChrome Soporte completo 62Edge Soporte completo 79Firefox Soporte completo 78IE Sin soporte NoOpera Soporte completo 49Safari Soporte completo 12WebView Android Soporte completo 62Chrome Android Soporte completo 62Firefox Android Sin soporte NoOpera Android Soporte completo 46Safari iOS Soporte completo 12Samsung Internet Android Soporte completo 8.0nodejs Soporte completo 8.10.0
Soporte completo 8.10.0
Soporte completo 8.3.0
Deshabilitado
Deshabilitado From version 8.3.0: this feature is behind the --harmony runtime flag.
execChrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 4Opera Soporte completo 5Safari Soporte completo 1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
flagsChrome Soporte completo 49Edge Soporte completo 79Firefox Soporte completo 37IE Sin soporte NoOpera Soporte completo 39Safari Soporte completo 9WebView Android Soporte completo 49Chrome Android Soporte completo 49Firefox Android Soporte completo 37Opera Android Soporte completo 41Safari iOS Soporte completo 9Samsung Internet Android Soporte completo 5.0nodejs Soporte completo 6.0.0
globalChrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 5.5Opera Soporte completo 5Safari Soporte completo 1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
ignoreCaseChrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 5.5Opera Soporte completo 5Safari Soporte completo 1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
RegExp.input ($_)
No estándar
Chrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 5.5Opera Soporte completo 15Safari Soporte completo 3WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 14Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
lastIndexChrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 5.5Opera Soporte completo 5Safari Soporte completo 1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
RegExp.lastMatch ($&)
No estándar
Chrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 5.5Opera Soporte completo 10.5Safari Soporte completo 3WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 11Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
RegExp.lastParen ($+)
No estándar
Chrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 5.5Opera Soporte completo 10.5Safari Soporte completo 3WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 11Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
RegExp.leftContext ($`)
No estándar
Chrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 5.5Opera Soporte completo 8Safari Soporte completo 3WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
lookbehind assertions ((?<= ) and (?<! ))Chrome Soporte completo 62Edge Soporte completo 79Firefox Soporte completo 78IE Sin soporte NoOpera Soporte completo 49Safari Sin soporte NoWebView Android Soporte completo 62Chrome Android Soporte completo 62Firefox Android Sin soporte No
Notas
Sin soporte No
Notas
Notas See bug 1225665.
Opera Android Soporte completo 46Safari iOS Sin soporte NoSamsung Internet Android Soporte completo 8.0nodejs Soporte completo 8.10.0
multilineChrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 5.5Opera Soporte completo 5Safari Soporte completo 1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
RegExp.$1-$9Chrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 4Opera Soporte completo 5Safari Soporte completo 1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
Named capture groupsChrome Soporte completo 64Edge Soporte completo 79Firefox Soporte completo 78IE Sin soporte NoOpera Soporte completo 51Safari Soporte completo 11.1WebView Android Soporte completo 64Chrome Android Soporte completo 64Firefox Android Sin soporte NoOpera Android Soporte completo 47Safari iOS Soporte completo 11.3Samsung Internet Android Soporte completo 9.0nodejs Soporte completo 10.0.0
Soporte completo 10.0.0
Soporte completo 8.3.0
Deshabilitado
Deshabilitado From version 8.3.0: this feature is behind the --harmony runtime flag.
Unicode property escapes (\p{...})Chrome Soporte completo 64Edge Soporte completo 79Firefox Soporte completo 78IE Sin soporte NoOpera Soporte completo 51Safari Soporte completo 11.1WebView Android Soporte completo 64Chrome Android Soporte completo 64Firefox Android Sin soporte NoOpera Android Soporte completo 47Safari iOS Soporte completo 11.3Samsung Internet Android Soporte completo 9.0nodejs Soporte completo 10.0.0
Soporte completo 10.0.0
Soporte completo 8.3.0
Deshabilitado
Deshabilitado From version 8.3.0: this feature is behind the --harmony runtime flag.
RegExp.rightContext ($')
No estándar
Chrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 5.5Opera Soporte completo 8Safari Soporte completo 3WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
sourceChrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 4Opera Soporte completo 5Safari Soporte completo 1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
stickyChrome Soporte completo 49Edge Soporte completo 13Firefox Soporte completo 3IE Sin soporte NoOpera Soporte completo 36Safari Soporte completo 10WebView Android Soporte completo 49Chrome Android Soporte completo 49Firefox Android Soporte completo 4Opera Android Soporte completo 36Safari iOS Soporte completo 10Samsung Internet Android Soporte completo 5.0nodejs Soporte completo Si
testChrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 4Opera Soporte completo 5Safari Soporte completo 1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
toSource
No estándar
Chrome Sin soporte NoEdge Sin soporte NoFirefox Sin soporte 1 — 74
Notas
Sin soporte 1 — 74
Notas
Notas Starting in Firefox 74, toSource() is no longer available for use by web content. It is still allowed for internal and privileged code.
IE Sin soporte NoOpera Sin soporte NoSafari Sin soporte NoWebView Android Sin soporte NoChrome Android Sin soporte NoFirefox Android Soporte completo 4Opera Android Sin soporte NoSafari iOS Sin soporte NoSamsung Internet Android Sin soporte Nonodejs Sin soporte No
toStringChrome Soporte completo 1Edge Soporte completo 12Firefox Soporte completo 1IE Soporte completo 4Opera Soporte completo 5Safari Soporte completo 1WebView Android Soporte completo 1Chrome Android Soporte completo 18Firefox Android Soporte completo 4Opera Android Soporte completo 10.1Safari iOS Soporte completo 1Samsung Internet Android Soporte completo 1.0nodejs Soporte completo Si
unicodeChrome Soporte completo 50Edge Soporte completo 12
Notas
Soporte completo 12
Notas
Notas Case folding is implemented in version 13
Firefox Soporte completo 46IE Sin soporte NoOpera Soporte completo 37Safari Soporte completo 10WebView Android Soporte completo 50Chrome Android Soporte completo 50Firefox Android Soporte completo 46Opera Android Soporte completo 37Safari iOS Soporte completo 10Samsung Internet Android Soporte completo 5.0nodejs Soporte completo Si
@@matchChrome Soporte completo 50Edge Soporte completo 13Firefox Soporte completo 49IE Sin soporte NoOpera Soporte completo 37Safari Soporte completo 10WebView Android Soporte completo 50Chrome Android Soporte completo 50Firefox Android Soporte completo 49Opera Android Soporte completo 37Safari iOS Soporte completo 10Samsung Internet Android Soporte completo 5.0nodejs Soporte completo 6.0.0
@@matchAllChrome Soporte completo 73Edge Soporte completo 79Firefox Soporte completo 67IE Sin soporte NoOpera Soporte completo 60Safari Soporte completo 13WebView Android Soporte completo 73Chrome Android Soporte completo 73Firefox Android Soporte completo 67Opera Android Soporte completo 52Safari iOS Soporte completo 13Samsung Internet Android Soporte completo 5.0nodejs Soporte completo 12.0.0
@@replaceChrome Soporte completo 50Edge Soporte completo 79Firefox Soporte completo 49IE Sin soporte NoOpera Soporte completo 37Safari Soporte completo 10WebView Android Soporte completo 50Chrome Android Soporte completo 50Firefox Android Soporte completo 49Opera Android Soporte completo 37Safari iOS Soporte completo 10Samsung Internet Android Soporte completo 5.0nodejs Soporte completo 6.0.0
@@searchChrome Soporte completo 50Edge Soporte completo 13Firefox Soporte completo 49IE Sin soporte NoOpera Soporte completo 37Safari Soporte completo 10WebView Android Soporte completo 50Chrome Android Soporte completo 50Firefox Android Soporte completo 49Opera Android Soporte completo 37Safari iOS Soporte completo 10Samsung Internet Android Soporte completo 5.0nodejs Soporte completo 6.0.0
@@speciesChrome Soporte completo 50Edge Soporte completo 13Firefox Soporte completo 49IE Sin soporte NoOpera Soporte completo 37Safari Soporte completo 10WebView Android Soporte completo 50Chrome Android Soporte completo 50Firefox Android Soporte completo 49Opera Android Soporte completo 37Safari iOS Soporte completo 10Samsung Internet Android Soporte completo 5.0nodejs Soporte completo 6.5.0
Soporte completo 6.5.0
Soporte completo 6.0.0
Deshabilitado
Deshabilitado From version 6.0.0: this feature is behind the --harmony runtime flag.
@@splitChrome Soporte completo 50Edge Soporte completo 79Firefox Soporte completo 49IE Sin soporte NoOpera Soporte completo 37Safari Soporte completo 10WebView Android Soporte completo 50Chrome Android Soporte completo 50Firefox Android Soporte completo 49Opera Android Soporte completo 37Safari iOS Soporte completo 10Samsung Internet Android Soporte completo 5.0nodejs Soporte completo 6.0.0

Leyenda

Soporte completo  
Soporte completo
Sin soporte  
Sin soporte
No estandar . Esperar poco soporte entre navegadores.
No estandar . Esperar poco soporte entre navegadores.
Deprecado. No debe ser usado en nuevos sitios web.
Deprecado. No debe ser usado en nuevos sitios web.
Ver notas de implementación.
Ver notas de implementación.
El usuario debe de habilitar explícitamente esta característica.
El usuario debe de habilitar explícitamente esta característica.

Notas específicas de Firefox

A partir de Firefox 34, en el caso de un grupo de captura con cuantificadores que impiden su ejercicio, el texto coincidente para un grupo de captura ahora es undefined en lugar de una cadena vacía:

// Firefox 33 o anterior
'x'.replace(/x(.)?/g, function(m, group) {
  console.log("'grupo: " + group + "'");
}); 
// 'grupo: '

// Firefox 34 o más reciente
'x'.replace(/x(.)?/g, function(m, group) {
  console.log("'grupo: " + group + "'");
}); 
// 'grupo: undefined'

Ten en cuenta que, debido a la compatibilidad web, RegExp.$N seguirá devolviendo una cadena vacía en lugar de undefined (error 1053944).

Ve también