Ver Mensaje Individual
  #8 (permalink)  
Antiguo 14/11/2009, 00:24
Avatar de zerokilled
zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 9 meses
Puntos: 1485
Respuesta: problema con expresiones regulares URGENTE

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.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 14/11/2009 a las 00:32