2011-09-15 5 views
7

Je fais une petite méthode javascript, qui reçoit une liste de points, et je dois lire ces points pour créer un polygone dans une carte google.Pourquoi cette regex javascript ne fonctionne pas?

Je reçois les point sur la forme:

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

Je l'ai fait l'expression rationnelle suivante:

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

Je l'ai testé avec RegexPal et les données exactes que je reçois:

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

et il fonctionne , alors pourquoi quand j'ai ce code dans mon javascript, je reçois null dans le résultat?

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

Je n'ai pas d'erreur javascript lors de l'exécution (avec le mode de débogage de google chrome). Ce code est hébergé dans une fonction javascript qui se trouve dans un fichier JS inclus. Cette méthode est appelée dans la méthode OnLoad.

J'ai beaucoup cherché, mais je ne peux pas trouver pourquoi cela ne fonctionne pas. Merci beaucoup!

Répondre

14

Utilisez un regex literal [MDN]:

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

Vous faites deux erreurs lorsque vous utilisez RegExp[MDN]:

  • Les "délimiteurs" / sont ne devraient pas faire partie de l'expression
  • Si vous définissez une expression sous forme de chaîne, vous devez échapper à la barre oblique inverse, car il s'agit du caractère d'échappement dans les chaînes

De plus, les modificateurs sont passés en second argument à la fonction.

Donc, si vous vouliez utiliser RegExp (que vous n'avez pas dans ce cas), l'équivalent serait:

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

(et je pense que vous voyez maintenant pourquoi littéraux regex sont plus pratiques)


Je trouve toujours utile de copier et passé une expression RegExp dans la console et voir sa sortie. Prenant votre expression originale, nous obtenons:

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

ce qui signifie que les expressions tente de faire correspondre /, s et g littéralement et les parens () sont encore traités comme des caractères spéciaux.


Mise à jour:.match() retourne un tableau:

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

qui ne semble pas être très utile.

Vous devez utiliser .exec()[MDN] pour extraire les numéros:

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

Cela doit être appelé à plusieurs reprises jusqu'à ce que l'ensemble des chaînes ont été traitées.

Exemple:

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

Cela crée un tableau de tableaux et unaire plus (+) vous permet de convertir les chaînes en nombres:

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

Bien sûr, si vous voulez que les valeurs sous forme de chaînes et pas comme des chiffres, vous pouvez simplement omettre le +.

+1

Super, ça a marché! Je ne connaissais pas ce synthax. Petite question: je reçois un tableau avec le résultat, mais comment puis-je récupérer le contenu de ma capture "(...)"? (Ceci: ([0-9 .-] +)) – J4N

+1

S'il vous plaît voir ma mise à jour. –

+1

merci beaucoup, c'est ce dont j'avais besoin – J4N

Questions connexes