Rexact
Cheatsheet

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

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.