2011-09-15 26 views
7

Estoy haciendo un pequeño método de javascript, que recibe una lista de puntos, y tengo que leer esos puntos para crear un polígono en un mapa de google.¿Por qué este JavaScript regex no funciona?

que reciben los puntos de la forma:

(latitud, longitud), (latitud, longitud), (latitud, longitud)

Así que he hecho la siguiente expresión regular:

\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\) 

lo he probado con RegexPal y los datos exactos que recibo:

(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262) 

y funciona Entonces, ¿por qué cuando tengo este código en mi javascript, recibo un nulo en el resultado?

var polygons="(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262)"; 
var reg = new RegExp("/\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g"); 
var result = polygons.match(reg); 

He ningún error durante la ejecución de Javascript (con el modo de depuración de Google Chrome). Este código está alojado en una función de JavaScript que se encuentra en un archivo JS incluido. Este método se llama en el método OnLoad.

He buscado mucho, pero no puedo encontrar por qué esto no funciona. ¡Muchas gracias!

Respuesta

14

Utilice un regex literal [MDN]:

var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g; 

Usted está haciendo dos errores cuando se utiliza RegExp[MDN]:

  • Los "delimitadores" / son no debe ser parte de la expresión
  • Si define una expresión como cadena, debe escapar de la barra invertida, porque es el carácter de escape en las cadenas

Además, los modificadores se pasan como segundo argumento a la función.

Así que si quieres usar RegExp (que no tiene que en este caso), el equivalente sería:

var reg = new RegExp("\\(\\s*([0-9.-]+)\\s*,\\s([0-9.-]+)\\s*\\)", "g"); 

(y creo que ahora veo por qué literales de expresiones regulares son más convenientes)


siempre me resulta útil para copiar y pegar una expresión RegExp en la consola y ver su salida. Tomando su expresión original, obtenemos:

/(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g 

lo que significa que las expresiones intenta hacer coincidir /, y sg literal y los parens () siguen siendo tratadas como caracteres especiales.


Actualización:.match() devuelve una matriz:

["(25.774252, -80.190262)", "(18.466465, -66.118292)", ... ] 

que no parece ser muy útil.

usted tiene que utilizar .exec()[MDN] para extraer los números:

["(25.774252, -80.190262)", "25.774252", "-80.190262"] 

Esto tiene que ser llamado varias veces hasta que el conjunto de las cadenas fue procesada.

Ejemplo:

var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g; 
var result, points = []; 

while((result = reg.exec(polygons)) !== null) { 
    points.push([+result[1], +result[2]]); 
} 

Esto crea una matriz de matrices y el unario más (+) convertirá las cadenas en números:

[ 
    [25.774252, -80.190262], 
    [18.466465, -66.118292], 
    ... 
] 

Por supuesto, si desea que los valores como cadenas y no como números, simplemente puede omitir el +.

+1

¡Genial, funcionó! No sabía esta sintaxis. Pequeña pregunta: recibo una matriz con el resultado, pero ¿cómo puedo recuperar el contenido de mi captura "(...)"? (Esto: ([0-9 .-] +)) – J4N

+1

Consulte mi actualización. –

+1

muchas gracias, es lo que necesitaba – J4N

Cuestiones relacionadas