2011-08-10 21 views
14

tengo algunas dificultades con este pequeño código JavaScript:JavaScript y expresiones regulares: sintaxis literal vs. RegExp objeto

var text="Z Test Yeah ! Z"; 

// With literal syntax, it returns true: good! 
alert(/(Z[\s\S]*?Z)/g.test(text)); 

// But not with the RegExp object O_o 
var reg=new RegExp('Z[\s\S]*?Z','g'); 
alert(reg.test(text)); 

No entiendo por qué la sintaxis literal y el objeto RegExp no me dan el mismo resultado ... El problema es que Tengo que usar el objeto RegExp ya que tendré algunas variables más adelante.

¿Alguna idea?

Gracias de antemano :)

+2

Buen trabajo al escribir una primera pregunta bien formateada y bien escrita. – zzzzBov

Respuesta

18

Se necesitan duplicar escapar \ caracteres en los literales de cadena, por lo que la expresión regular literal se prefiere típicamente.

Probar:

'Z[\\s\\S]*?Z' 
+0

¡Es correcto, con barras invertidas funciona ...! Muchas gracias, dado que no los necesitamos con sintaxis literal, no pensé que fueran obligatorios para el objeto RegExp. ¡Gracias de nuevo! – KorHosik

+0

@zzzzBov ¿Por qué tenemos que escapar del '\\' en el segundo caso y no del primer caso? – Geek

+3

@ Geek, la primera expresión regular utilizada es un literal RegExp. La segunda expresión regular utilizada es un constructor de objetos RegExp con un literal de cadena como argumento. Mi respuesta dice específicamente que necesitas duplicar los caracteres '' \ '' en los literales de cadenas. Para los literales de cadena, '' \ '' se usa para crear secuencias de escape para valores, mientras que en una expresión regular queremos que la secuencia de escape sea * be * el valor. '' "\ n" '' crea una cadena con un valor de nueva línea, mientras que '' "\\ n" '' crea una cadena con un valor de '' \ n''. La distinción es muy importante para los patrones de expresión regular. – zzzzBov

2

Creo que es porque hay que escapar de sus barras invertidas, incluso cuando se utilizan comillas simples. Pruebe esto:

new RegExp('Z[\\s\\S]*?Z','g') 
Cuestiones relacionadas