2010-05-17 17 views
43

Duplicar posibles:
Javascript regex returning true.. then false.. then true.. etc¿Por qué mi regex.test Javascript() alternando dar resultados

var r = /\d/g; 
var a = r.test("1"); // will be true 
var b = r.test("1"); // will be false 
console.log(a == b); // will be false 

favor explicarme por qué el resultado de r.test ("1 ") se alterna con cada llamada?

Pude solucionar el problema que estaba teniendo al eliminar el modificador g. Sin embargo, aún me gustaría entender por qué sucede esto.

Respuesta

63

Cuando usa /g, el objeto de expresión regular guardará el estado entre llamadas (ya que debe usarlo para hacer coincidir varias llamadas). Empareja una vez, pero las llamadas posteriores comienzan después de la coincidencia original.

(Este es un duplicado de Javascript regex returning true.. then false.. then true.. etc)

+0

gracias! Encontré algunos detalles adicionales que explican que .test es básicamente una abreviatura de .exec()! = Null, y es .exec() que almacena el lastIndex para la próxima llamada. (http://www.regular-expressions.info/javascript.html) Lo extraño es que incluso cuando se le asignan diferentes cadenas para cada llamada, ocurre lo mismo. ¿No se restablece el lastIndex si se invoca en una cadena diferente? –

+1

No, porque 'lastIndex' es una propiedad de la expresión regular, no de la cadena. En Perl, por el contrario, está asociado con la cadena (la propiedad 'pos'), mientras que en Java lo mantiene el objeto Matcher. 'lastIndex' es una fuente de mucha frustración: http://blog.stevenlevithan.com/archives/fixing-javascript-regexp –

Cuestiones relacionadas