Novedades ES6

Métodos para expresiones regulares

Las expresiones regulares son patrones que se utilizan para hacer coincidir combinaciones de caracteres en cadenas. En JavaScript, las expresiones regulares también son objetos. Estos patrones se utilizan con los métodos exec() y test() de RegExp, y con match(), matchAll(), replace(), replaceAll(), search() y split() métodos de String. Este capítulo describe las expresiones regulares de JavaScript.

Las expresiones regulares se utilizan con los métodos RegExp test() y exec() y con los métodos de String, match(), replace(), search() y split(). Estos métodos se explican en detalle en la referencia de JavaScript.

  • exec() Ejecuta una búsqueda por una coincidencia en una cadena. Devuelve un arreglo de información o null en una discrepancia.
  • test() Prueba una coincidencia en una cadena. Devuelve true o false.
  • match() Devuelve un arreglo que contiene todas las coincidencias, incluidos los grupos de captura, o null si no se encuentra ninguna coincidencia.
  • matchAll() Devuelve un iterador que contiene todas las coincidencias, incluidos los grupos de captura.
  • search() Prueba una coincidencia en una cadena. Devuelve el índice de la coincidencia, o -1 si la búsqueda falla.
  • replace() Ejecuta una búsqueda por una coincidencia en una cadena y reemplaza la subcadena coincidente con una subcadena de reemplazo.
  • replaceAll() Ejecuta una búsqueda de todas las coincidencias en una cadena y reemplaza las subcadenas coincidentes con una subcadena de reemplazo.
  • split() Utiliza una expresión regular o una cadena fija para dividir una cadena en un arreglo de subcadenas.
Cuando desees saber si un patrón se encuentra en una cadena, utiliza los métodos test() o search(); para obtener más información (pero una ejecución más lenta) utiliza los métodos exec() o match(). Si usas exec() o match() y si la búsqueda tiene éxito, estos métodos devuelven un arreglo y actualizan las propiedades del objeto expresión regular asociado y también del objeto de expresión regular predefinido, el objeto RegExp. Si la búsqueda falla, el método exec() devuelve null (que coacciona a false).

Método exec()

El método exec() ejecuta una busqueda sobre las coincidencias de una expresión regular en una cadena especifica. Devuelve el resultado como array, o null.
Si está ejecutando una expresión regular solo para buscar si algo se cumple o no, usa el método RegExp.prototype.test() o el método String.prototype.search().

Sintaxis

regexObj.exec(cadena)

Parametros

  • cadena Cadena sobre la cual se quiere aplicar la expresión regular

Valor devuelto

Si se encuentran coincidencial, el método exec() devuelve un array y actualiza las propiedades del objecto de la expresión regular. El array devuelto contiene los elementos encontrados en su primer elemento, y un elemento por cada parte de la expresión regular que se encuentra entre parentesis y se encuentra dentro del texto que fué capturado.
Si la busqueda falla, el método exec() devuelve null.

Método test()

El método test() ejecuta la búsqueda de una ocurrencia entre una expresión regular y una cadena especificada. Devuelve true o false.
Use test() cuando desee saber si existe la ocurrencia de un patrón en una cadena (similar al método String.prototype.search(), la diferencia es que test() devuelve un booleano, mientras que search() devuelve el índice de la coincidencia (si la encuentra) o -1 si no la encuentra).
Si requiere más información (a coste de una ejecución más lenta) utilice el método exec(). Al igual que este último, multiples llamadas a test() sobre la misma instancia global de una expresión regular avanzará desde de la ocurrencia anterior.

Sintaxis

regexObj.test(cadena) 

Parámetros

  • cadena La cadena a comparar contra la expresión regular.
Valor de Retorno

Retorna true si existe una coincidencia entre la expresión regular y la cadena especificada; de lo contrario retorna false.
Hasta ahora siempre hemos empleado el método test que retorna un valor true si el string cumple el patrón propuesto o false en caso contrario.

La clase RegExp cuenta con otro método llamado exec que retorna un vector con más datos en caso que el string cumpla el patrón propuesto o null si no cumple el patrón. Veamos con un problema que datos extras retorna este vector.


<!DOCTYPE html>
<html>
<head>
  <title>Ejemplo de JavaScript</title>
  <meta charset="UTF-8">
</head>
<body>

<script>
  var oracion='saliendo de la casa que esta en la montaña';
  var patron1=/la/;
  var vector1=patron1.exec(oracion);
  document.write(vector1.index);
  document.write('<br>');
  document.write(vector1.input);
  document.write('<br>');
  var patron2=/lax/;
  var vector2=patron2.exec(oracion);
  document.write(vector2);
</script>
  
</body>
</html>

Hemos definido en la variable oracion el valor : 'saliendo de la casa que esta en la montaña'. El primer patrón de búsqueda es verificar si contiene los caracteres 'la' la oración:

  var oracion='saliendo de la casa que esta en la montaña';
  var patron1=/la/;
  var vector1=patron1.exec(oracion);

El método exec retornará un valor distinto a null (tener en cuenta que retorna un vector) ya que la palabra 'la' está contenida en la oración.

El vector devuelto por el método exec tiene dos propiedades llamadas index e input:

La propiedad index almacena la posición dentro del string donde se cumple el patrón, en nuestro ejemplo retorna un 12 que es la posición donde se encuentra la l:

saliendo de la casa que esta en la montaña

La propiedad input almacena la cadena que se está analizando.

La segundo parte del problema define un segundo patrón:

  var patron2=/lax/;
  var vector2=patron2.exec(oracion);

Como no se encuentra en el string la cadena 'lax' el método exec retorna un valor null, es decir no retorna un vector.

Método match()

El método match() se usa para obtener todas las ocurrencias de una expresión regular dentro de una cadena. Si la expresión regular no incluye el flag g, devuelve el mismo resultado que Regexp.exec(). Si la expresión regular incluye el flag g, el método devuelve un Array que contiene todos los emparejamientos.

Sintaxis

cadena.match(regexp)

Parámetros

  • regexp Un objeto expresión regular. Si se pasa un objeto obj que no es expresión regular, se convierte implícitamente a RegExp usando new RegExp(obj).

Método matchAll()

El método matchAll() retorna un iterador de todos los resultados de ocurrencia en una cadena de texto contra una expresión regular, incluyendo grupos de captura. Antes de la adición de matchAll a JavaScript, fue posible hacer llamados a regexp.exec (y usar expresiones regulares con la bandera /g) en un ciclo para obtener las ocurrencias.

Sintaxis

cadena.matchAll(expresionRegular)
Parámetros
  • expresionRegular Un objeto expresión regular. Si se pasa un objeto no-RegExp obj, este es implícitamente convertido a RegExp vía new RegExp(obj).

Método search()

El método search() ejecuta una búsqueda que encaje entre una expresión regular y el objeto String desde el que se llama.
Cuando se desee saber en qué casos un patrón se encuentra en una cadena de texto utiliza search() (si sólo deseas saber si existe, utiliza el método test() del prototipo de RegExp); para más información (pero de ejecución más lenta) utiliza match() (similar al método exec() de las expresiones regulares).

Sintaxis

str.search(expresionregular)

Parámetros
  • expresionRegular Un objeto expresión regular. Si se pasa un objeto obj que no sea una expresión regular, se convierte implicitamente en una expresión regualar usando new RegExp(obj)..
Valor devuelto

El índice de la primera coincidencia entre la expresión regular y la cadena de texto proporcionada, si no se encuentra devuelve -1.

Método replace()


El método replace() devuelve una nueva cadena con algunas o todas las coincidencias de un patrón, siendo cada una de estas coincidencias reemplazadas por remplazo. El patrón puede ser una cadena o una RegExp, y el reemplazo puede ser una cadena o una función que será llamada para cada coincidencia. Si el patrón es una cadena, sólo la primera coincidencia será reemplazada.

Este método no cambia el objeto String sobre el que se realiza la llamada. Simplemente devuelve una nueva cadena.
Para realizar una búsqueda global y reemplazarla, o se incluye el flag g en la expresión regular o si el primer parámetro es una cadena, se incluye g en el parámetro flags.

Sintaxis

cadena.replace(regexp|substr, newSubStr|function[,   flags]);
Parámetros
  • expresionregular Un objeto RegExp o literal. Las coincidencias son reemplazadas por ewSubSt o el valor devuelto por la función especificada.
  • subcadena Un objeto String que será reemplazado por nuevaSubcadena.
  • nuevaSubcadena El objeto String que reemplaza la subcadena que recibida desde el primer parámetro.
  • funcion Una función que será invocada para crear la nueva subcadena (para ponerla en lugar de la subcadena recibida por el primer parámetro).
  • flags Un objeto String que contiene cualquier combinación de flags de la clase RegExp: g - emparejamiento global, i - ignorar mayúsculas, m - emparejar multiples líneas. Este parámetro se usa sólo si el primer parámetro es una cadena.

Método replaceAll()

El método replaceAll() devuelve una nueva cadena con todas las coincidencias de a patternreemplazadas por a replacement. El patternpuede ser una cadena o una RegExp, y la replacementpuede ser una cadena o una función a ser llamados para cada partido.

Sintaxis

newStr = str.replaceAll(regexp|substr, newSubstr|function)
Parámetros
  • regexp (patrón) Un RegExpobjeto o literal con la bandera global. Las coincidencias se reemplazan con newSubstro el valor devuelto por el especificado function. Una expresión regular sin el indicador global ("g") arrojará un TypeError: "replaceAll debe llamarse con una expresión regular global".
  • substr Un String que debe ser reemplazado por newSubstr. Se trata como una cadena literal y no se interpreta como una expresión regular..
  • newSubstr (reemplazo) El Stringque reemplaza la subcadena especificada por el especificado regexpo substrparámetro. Se admiten varios patrones de reemplazo especiales; consulte la sección " Especificar una cadena como parámetro " a continuación.
  • funcion Una función que se invocará para crear la nueva subcadena que se utilizará para reemplazar las coincidencias con el regexpo dado substr. Los argumentos proporcionados a esta función se describen en la sección " .

Método split()

El método split() divide un objeto de tipo String en un array (vector) de cadenas mediante la separación de la cadena en subcadenas, el método split() devuelve el nuevo array.
Cuando se encuentra, el separador es eliminado de la cadena y las subcadenas obtenidas se devuelven en un array. Si el separador no es encontrado o se omite, el array contendrá un único elemento con la cadena original completa. Si el separador es una cadena vacía la cadena es convertida en un array de carácteres.
Si el separador es una expresión regular que contiene paréntesis de captura, entonces cada vez que el separador concuerda, los resultados (incluído cualquier resultado indefinido) de los paréntesis de captura son divididos en el array resultante. Sin embargo no todos los navegadores soportan esta característica.

Sintaxis

cadena.split([separador][,limite])
Parámetros
  • separador Especifica el carácter a usar para la separación de la cadena. El separador es tratado como una cadena o como una expresión regular. Si se omite el separador, el array devuelto contendrá un sólo elemento con la cadena completa.
  • limite Opcional. Entero que especifica un límite sobre el número de divisiones a realizar. El método split() todavía se divide en todas las concordancias del separador, pero divide la matriz devuelta en la cantidad de elementos impuesta por el limite

El objeto String tiene métodos que reciben como parámetro una expresión regular.

El primer método es el search. Este método busca la primer ocurrencia del string según la expresión que le hemos pasado como parámetro. Devuelve un entero indicando la posición donde comienza la cadena encontrada o un -1 si no encuentra el patrón en el string.

<!DOCTYPE html>
<html>
<head>
  <title>Ejemplo de JavaScript</title>
  <meta charset="UTF-8">
</head>
<body>

<script>
  var oracion='La noche está muy oscura y estrellada.';
  if (oracion.search(/estrella/)!=-1)
    alert('el string estrella está contenido en la variable oracion');
</script>
  
</body>
</html>

Hemos dispuesto un if para controlar si el string 'estrella' está contenido en la variable oración:

>  if (oracion.search(/estrella/)!=-1)
    alert('el string estrella está contenido en la variable oracion');

Por supuesto que podemos emplear expresiones regulares tan complejas como necesitemos utilizando distintos metacaracteres y modificadores.

El segundo método del objeto String que veremos es el replace.

El método replace realiza una búsqueda y reemplazo. Se toma una expresión regular como primer parámetro y un string de reemplazo como su segundo argumento. Si la expresión regular tiene la bandera g, el método replace sustituye todas las coincidencias en la cadena de reemplazo, en caso contrario, se reemplaza sólo la primera coincidencia que encuentre.

<!DOCTYPE html>
<html>
<head>
  <title>Ejemplo de JavaScript</title>
  <meta charset="UTF-8">
</head>
<body>

<script>
  var oracion='uno dos tres uno dos tres uno dos tres';
  var cadena=oracion.replace(/uno/g,'1');
  alert(cadena); //1 dos tres 1 dos tres 1 dos tres
</script>
  
</body>
</html>

En este problema queremos obtener otro String sustituyendo todas las cadenas 'uno' por el caracter '1'. Para hacer que se sustituyan todas las ocurrencias debemos emplear el modificador g:

  var cadena=oracion.replace(/uno/g,'1');

Es importante tener en cuenta que la variable que llama al método replace no se modifica, sino que retorna otro String con el resultado.

El tercer método es el split que tiene por objetivo subdividir un string y retornar un vector con dichas partes. Para la división toma en cuenta la expresión regular pasada como parámetro.

<!DOCTYPE html>
<html>
<head>
  <title>Ejemplo de JavaScript</title>
  <meta charset="UTF-8">
</head>
<body>

<script>
  var cadena='(2,3)-(4,4)-(9,3)';
  var vec=cadena.split(/-/);
  for(var x=0;x<vec.length;x++)
  {
    document.write(vec[x]+'<br>');
  }
</script>
  
</body>
</html>

El vector vec almacena los valores: (2,3) (4,4) y (9,3), ya que la expresión regular indicada define el caracter - como patrón de corte.

El último método a analizar del objeto String es el match. Tiene como parámetro una expresión regular y retorna un vector con todos los string que cumplen el patrón especificado (siempre y cuando hallamos activado la bandera 'g' (global))

Problema

Se tiene un string donde tenemos almacenados los nombres de personas seguido de sus edades. Generar un vector solo con las edades de todas las personas.

<!DOCTYPE html>
<html>
<head>
  <title>Ejemplo de JavaScript</title>
  <meta charset="UTF-8">
</head>
<body>

<script>
  var cadena='juan 10 luis 43 pedro 21 carlos 33';
  var vec=cadena.match(/\d+/g);
  for(var x=0;x<vec.length;x++)
  {
    document.write(vec[x]+'<br>');
  }
</script>
  
</body>
</html>