la verdad que para poder responder a tu duda tienes que verlo con un depurador porque se me hace muy dificil explicarlo, pero tratare. tarde un tiempo porque tenia que investigar antes de darte una respuesta, aparte que mi libro tampoco habla acerca de dicha propiedad. primero mencionar que no estoy seguro si la propiedad
lastMatch esta obsoleta en favor de
$&, o si es al reves. a mi parecer,
$& es obsoleto en favor de
lastMatch. [
http://www.nusphere.com/kb/jscoreref/deprecat.html]
preambulo
sucede que
lastMatch esta destinado a funcionar con los metodos de expresiones regulares:
exec y
test. si se intenta emplear con cualquiera de los metodos de string
(match, search, replace, split, ...) produce resultados inconsistentes.
un ejemplo funcional
veamos un ejemplo con metodos de RegExp. en el ejemplo se evaluaran todas las palabras del string.
Código:
var str = "Lorem etiam luctus justo mi.";
var reg = /\w+/g, array = [];
while(reg.test(str))array.push(RegExp.lastMatch);
alert(array.toString());
// array consiste de los valores;
// "Lorem", "etiam", "luctus", "justo", "mi";
¿que sucede si lo aplicamos a replace?
Código:
var str = "Lorem etiam luctus justo mi.";
var reg = /\w+/g;
alert(str.replace(reg, RegExp.lastMatch));
// el string devuelto no es literalmente como se muestra a continuacion;
// para proposito de percepcion se reemplazara ciertos caracteres al;
// equivalente hexadecimal;
// "\x0A \x0A \x0A \x0A \x0A."
alert(RegExp.lastMatch);
// muestra el string "mi";
¿por qué sucede?
los metodos
exec y test tienen una particularidad que los metodos de string no comparten. se trata de la habilidad de usar la expresion multiples veces y al mismo tiempo devolver resultados diferentes. un ejemplo lo vimos en la condicion del bucle
while. sin embargo, para que esta habilidad se pueda dar es necesario que la expresion sea global. en cada invocacion la expresion asigna un valor a
lastMatch. en el caso de los metodos de String, se podria decir que la expresion es aplicada una sola vez y al final de la aplicacion la expresion asigna el valor a
lastMatch.
el identificador $&
en las referencias que encontre,
$& es el nombre corto para la propiedad
lastMatch. de hecho, otra forma que se puede escribir es
RegExp['$&']. cuando este se emplea en un string, como el caso del metodo
replace,
$& siempre devuelve el pareo mas reciente. ahora bien, no confundirlo con
RegExp['$&'] ya que este es un sinonimo de
lastMatch. si usaramos
RegExp['$&'] en
replace volvemos al mismo resultado como en los ejemplos anteriores.