Regex coordonnées GPS décimales
Des coordonnées GPS décimales, ce n'est pas juste « deux nombres séparés par une virgule » : la latitude doit rester entre -90 et 90, la longitude entre -180 et 180. La réponse à 140 votes sur Stack Overflow ignore complètement ces bornes — un commentaire signale qu'elle accepte « 91,181 ». La réponse à 288 votes, la plus votée du fil, corrige bien les bornes... mais un autre commentateur a dû publier un correctif quelques mois plus tard pour gérer un espace avant la virgule, que l'auteur original n'avait pas prévu. Voici un motif qui couvre aussi ce dernier cas, comparé aux trois réponses du même fil.
/^[-+]?([1-8]?[0-9](\.[0-9]+)?|90(\.0+)?)\s*,\s*[-+]?(180(\.0+)?|((1[0-7][0-9])|([1-9]?[0-9]))(\.[0-9]+)?)$/passe 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le 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 | sûr |
| 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 | sûr |
| 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 | sûr |
Implémentation
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);Limites
- 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.