La propiedad lastIndex

El método exec no provee con una manera cómoda de empezar a buscar desde una posición dada dentro del string. Pero sí tiene una manera incómoda de hacerlo.

Los objetos de expresiones regulares tienen propiedades. Una de ellas, por ejemplo, es source, que contiene el string desde el que se creó esa expresión. Otra propiedad (de la que hablaremos en este capítulo), es lastIndex, que controla, en circunstancias limitadas, donde empezará el siguiente match.

Esas circunstancias son que la expresión regular debe tener la opción global (g) activada, y el match debe ocurrir a través del método exec. Una vez más, una solución más cómoda habría sido permitir que se le pasase un argumento extra a exec.

var pattern = /y/g;
pattern.lastIndex = 3;
var match = pattern.exec("xyzzy");
console.log(match.index);
// → 4
console.log(pattern.lastIndex);
// → 5

Si el match tuvo éxito, la llamada a exec automáticamente actualiza la propiedad lastIndex al punto justo después del match. Si no se encuentra ningún match, lastIndex se pone a 0, que es el valor que tiene también en un objeto expresión regular recién creado.

Al usar un valor global de expresión regular para múltiples llamadas a exec, estas actualizaciones automáticas a la propiedad lastIndex pueden causar problemas. Tu expresión regular puede estar comenzando accidentalmente en un índice que fue dejado por una llamada anterior.

var digit = /\d/g;
console.log(digit.exec("here it is: 1"));
// → ["1"]
console.log(digit.exec("and now: 1"));
// → null

Otro efecto interesante de la opción global es que cambia la manera en la que el método match funciona en strings. Cuando se llama con una expresión global, en lugar de devolver un array similar al que devuelve exec, match encontrará todos los matches del patrón en el string y devolverá un array con los strings que han casado.

console.log("Banana".match(/an/g));
// → ["an", "an"]

Así que hay que tener cuidado con las expresiones regulares globales. Los casos donde son necesarias -llamadas a replace y lugares donde quieres usar explícitamente lastIndex- son normalmente los únicos lugares donde quieres usarlo.

results matching ""

    No results matching ""