Regex Decimal GPS coordinates
Decimal GPS coordinates aren't just "two numbers separated by a comma": latitude must stay between -90 and 90, longitude between -180 and 180. The 140-vote Stack Overflow answer completely ignores these bounds - a comment points out it accepts "91,181". The 288-vote answer, the top-voted one in the thread, does fix the bounds... but another commenter had to publish a fix months later to handle a space before the comma, which the original author hadn't accounted for. Here's a pattern that also covers that case, compared against all three answers from the same thread.
/^[-+]?([1-8]?[0-9](\.[0-9]+)?|90(\.0+)?)\s*,\s*[-+]?(180(\.0+)?|((1[0-7][0-9])|([1-9]?[0-9]))(\.[0-9]+)?)$/passes 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — réponse à 140 votes, aucune borne : accepte des valeurs hors plage comme « 91,181 » (signalé en commentaire par un autre utilisateur) | ^(-?\d+(\.\d+)?),\s*(-?\d+(\.\d+)?)$ | 15 / 20 | safe |
| Stack Overflow — réponse à 22 votes, limite la latitude à 1-2 chiffres mais accepte encore « 99 » (signalé en commentaire : hors plage -90/+90) | ^([-+]?\d{1,2}([.]\d+)?),\s*([-+]?\d{1,3}([.]\d+)?)$ | 16 / 20 | safe |
| Stack Overflow — réponse la plus votée du fil (288 votes), bornes correctes mais espace non géré avant la virgule (seulement après) — un commentateur a dû publier un correctif distinct pour ce cas | ^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$ | 19 / 20 | safe |
Implementation
const re = new RegExp("^[-+]?([1-8]?[0-9](\\.[0-9]+)?|90(\\.0+)?)\\s*,\\s*[-+]?(180(\\.0+)?|((1[0-7][0-9])|([1-9]?[0-9]))(\\.[0-9]+)?)$", "");
re.test(input);Limits
- Valide seulement la FORME et les bornes numériques (-90/90, -180/180) : n'a aucun moyen de vérifier qu'un point donné correspond à un lieu réellement accessible ou cohérent (le milieu d'un océan est une coordonnée parfaitement valide).
- Ne gère qu'un seul séparateur littéral (la virgule) entre latitude et longitude : les formats DMS (degrés/minutes/secondes, « 48°51'24"N ») ou avec lettres cardinales (« 48.8566N, 2.3522E ») nécessitent un motif complètement différent.
- N'impose aucune précision minimale ou maximale de décimales : « 45, 90 » (entiers) et « 45.123456789012, 90.987654321098 » (12 décimales, bien plus précis que ce que le GPS civil permet réellement) passent tous deux ce test.
- Le séparateur virgule crée une ambiguïté avec la notation décimale à la française (« 45,123 » peut se lire comme une paire lat/lon 45 et 123, ou comme le nombre décimal unique 45,123) — ce motif tranche toujours en faveur de la paire, sans pouvoir deviner l'intention réelle de qui l'a saisi.