2011-09-15 12 views
7

Robię małą metodę javascript, która otrzymuje listę punktów, i muszę przeczytać te punkty, aby utworzyć wielobok na mapie google.Dlaczego to wyrażenie regularne javascript nie działa?

otrzymam te punkt na formularzu:

(lat, długie), (lat, długie), (lat, długie)

więc zrobiłem następujące wyrażenia regularnego:

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

Przetestowałem go RegexPal i dokładne dane otrzymuję:

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

i działa , więc dlaczego, gdy mam ten kod w moim javascript, otrzymuję zero w wyniku?

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

Nie mam błąd javascript podczas wykonywania (w trybie debugowania google chrome). Ten kod jest hostowany w funkcji javascript, która znajduje się w dołączonym pliku JS. Ta metoda jest wywoływana w metodzie OnLoad.

Szukałem dużo, ale nie mogę znaleźć, dlaczego to nie działa. Dziękuję Ci bardzo!

Odpowiedz

14

Użyj regex literal [MDN]:

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

Robisz dwa błędy podczas korzystania RegExp[MDN]:

  • The "ograniczniki" / są nie powinny być częścią wypowiedzi
  • Jeśli zdefiniujemy wyrażenie jako string, musisz uciec od ukośnika odwrotnego, ponieważ jest to znak escape w ciągach znaków

Ponadto, modyfikatory są przekazywane jako drugi argument funkcji.

Więc jeśli chciał użyć RegExp (którego nie trzeba w tym przypadku), odpowiednik byłoby:

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

(i myślę, że teraz widać dlaczego regex literały są bardziej wygodne)


zawsze znaleźć przydatne do kopiowania i przeszłości wypowiedzi RegExp w konsoli i zobaczyć swój wynik. Biorąc swój pierwotny wyraz, otrzymujemy:

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

co oznacza, że ​​wyrażenia próbuje dopasować /, s i g dosłownie i nawiasy () są nadal traktowane jako znaki specjalne.


Aktualizacja:.match() zwraca tablicę:

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

które nie wydają się być bardzo użyteczne.

Musisz użyć .exec()[MDN] wyodrębnić numery:

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

To musi być wielokrotnie nazywany aż całe ciągi został przetworzony.

Przykład:

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

ta tworzy tablicę tablic i tym jednoskładnikowa Plus (+) przekonwertuje sznurki w liczbach:

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

oczywiście jeśli chcesz wartości jako ciągi i nie jako liczby, można po prostu pominąć +.

+1

Świetnie, zadziałało! Nie znałem tej synthax. Małe pytanie: otrzymuję tablicę z wynikiem, ale jak mogę odzyskać zawartość mojego przechwytywania "(...)"? (To: ([0-9 .-] +)) – J4N

+1

Proszę zobaczyć moją aktualizację. –

+1

dziękuję bardzo, to, czego potrzebowałem – J4N

Powiązane problemy