2010-09-28 12 views
9

Estoy utilizando el siguiente JavaScript para leer cadenas de un archivo de texto y procesarlos con una expresión regularJavascript expresión regular no todas las otras veces se le llama

while (!textFile.AtEndOfStream) 
{ 
    currLine = textFile.ReadLine(); 
    match = re.exec(currLine); 
    do stuff with match 
} 

El problema que tengo es que todas las otras veces re.exec se llama falla y devuelve nulo; por lo que la primera fila se procesa correctamente, pero la segunda fila da como resultado nulo, luego la tercera fila funciona, y la cuarta fila da como resultado nulo.

que puede utilizar el código siguiente para obtener el resultado que quiero

while (!textFile.AtEndOfStream) 
{ 
    currLine = textFile.ReadLine(); 
    match = re.exec(currLine); 
    if (match == null) match = re.exec(currLine); 
} 

pero que parece un poco de un kludge desagradable. ¿Alguien puede decirme por qué sucede esto y qué puedo hacer para solucionarlo correctamente?

+0

Andy E tiene la solución correcta, pero en caso de que le interese, podría cambiar esa última línea para 'match = match || re.exec (currLine); ' – Skilldrick

+0

@Skilldrick: eliminado el mío, porque la respuesta de Bobince fue más completa. Ahora él tiene la solución correcta :-) –

Respuesta

21

Su re se define con el modificador ‘global’, por ejemplo. algo así como /foo/g.

Cuando un RegExp es global, conserva el estado oculto en la instancia de RegExp para recordar el último lugar al que coincidió. La próxima vez que busque, buscará hacia adelante desde el índice del final del último partido y encontrará el próximo partido desde allí. Si está pasando una cadena diferente a la que aprobó la última vez, ¡esto dará resultados altamente impredecibles!

Cuando usa g expresiones regulares, debe agotarlas llamándolas repetidamente hasta que obtenga null. Luego, la próxima vez que lo use, volverá a coincidir desde el principio de la cadena. Alternativamente, puede establecer explícitamente re.lastIndex en 0 antes de usar uno. Si solo desea probar la existencia de una coincidencia, como en este ejemplo, lo más simple es simplemente no usar g.

Las interfaces JS RegExp son una de las partes del lenguaje más confusas y mal diseñadas. (Y esto es JavaScript, así que eso es mucho decir.)

+1

+1, eliminado el mío a favor de esto. Quería expandir el mío, pero me desvió :-) –

+0

Gracias por la excelente respuesta bobince. He eliminado el g y funciona perfectamente ahora. – Pandelon

3

Las expresiones regulares de Javascript mantienen algún estado entre las ejecuciones y probablemente esté cayendo en esa trampa.

siempre uso la función String.match y nunca ha sido mordido:

while (!textFile.AtEndOfStream) 
{ 
    match = textFile.ReadLine().match (re); 
    do stuff with match 
} 
Cuestiones relacionadas