2011-09-15 22 views
7

Sto facendo un piccolo metodo javascript, che riceve un elenco di punti, e devo leggere quei punti per creare un poligono in una mappa di google.Perché questa regex di JavaScript non funziona?

ricevo quelli punto sulla forma:

(lat, long), (lat, long), (lat, long)

Così ho fatto la seguente espressione regolare:

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

ho provato con RegexPal e i dati esatti che ricevo:

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

e funziona , quindi perché quando ho questo codice nel mio javascript, ricevo null nel risultato?

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); 

Non ho alcun errore javascript durante l'esecuzione (con la modalità di debug di google chrome). Questo codice è ospitato in una funzione javascript che si trova in un file JS incluso. Questo metodo è chiamato nel metodo OnLoad.

Ho cercato molto, ma non riesco a trovare il motivo per cui questo non funziona. Grazie mille!

risposta

14

Utilizzare un regex literal [MDN]:

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

Si stanno facendo due errori quando si utilizza RegExp[MDN]:

  • I "delimitatori" / sono non dovrebbe essere parte dell'espressione
  • Se si definisce un'espressione come stringa, devi sfuggire al backslash, perché è il carattere di escape nelle stringhe

Inoltre, i modificatori vengono passati come secondo argomento della funzione.

Quindi, se si voleva utilizzare RegExp (che non c'è bisogno di in questo caso), l'equivalente sarebbe:

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

(e credo che ora si vede il motivo per cui letterali regex sono più convenienti)


trovo sempre utile copiare e incollare un'espressione RegExp nella console e vedere la sua uscita. Prendendo la vostra espressione originale, otteniamo:

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

il che significa che le espressioni cerca di abbinare /, s e g letteralmente e le parentesi () sono ancora trattate come caratteri speciali.


Aggiornamento:.match() restituisce un array:

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

che non sembra essere molto utile.

è necessario utilizzare .exec()[MDN] per estrarre i numeri:

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

Questo deve essere chiamato più volte fino a quando l'intero stringhe è stato elaborato.

Esempio:

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]]); 
} 

Questo crea un array di array e il unario più (+) convertirà le stringhe in numeri:

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

Naturalmente se si desidera che i valori come stringhe e non come numeri, puoi semplicemente omettere lo +.

+1

Ottimo, ha funzionato! Non conoscevo questo sintone. Piccola domanda: ricevo un array con risultato, ma come posso recuperare il contenuto della mia cattura "(...)"? (Questo: ([0-9 .-] +)) – J4N

+1

Si prega di consultare il mio aggiornamento. –

+1

grazie mille, è quello che mi serviva – J4N

Problemi correlati