174 votes

Expression régulière pour la correspondance des coordonnées de latitude/longitude ?

J'essaie de créer une expression régulière pour faire correspondre des coordonnées de latitude et de longitude. Pour faire correspondre un nombre en double précision, j'ai utilisé (\-?\d+(\.\d+)?) et j'ai essayé de les combiner en une seule expression :

^(\-?\d+(\.\d+)?),\w*(\-?\d+(\.\d+)?)$

Je m'attendais à ce que cela corresponde à un double, une virgule, peut-être un espace, et un autre double, mais cela ne semble pas fonctionner. Plus précisément, cela ne fonctionne que s'il n'y a PAS d'espace, pas un ou plusieurs. Qu'est-ce que j'ai fait de mal ?

269voto

Iain Fraser Points 1887

Celui-ci fera correspondre strictement les valeurs de latitude et de longitude qui se situent dans la fourchette correcte :

^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$

Correspondances

  • +90.0, -127.554334
  • 45, 180
  • -90, -180
  • -90.000, -180.0000
  • +90, +180
  • 47.1231231, 179.99999999

Ne correspond pas

  • -90., -180.
  • +90.1, -100.111
  • -91, 123.456
  • 045, 180

0 votes

C'est génial. Félicitations pour l'inclusion de la vérification de la gamme.

1 votes

Je pense que vous avez une faute de frappe dans votre premier exemple de correspondance. Je doute que le RegEx corresponde à 3 valeurs.

0 votes

Corrigé. C'était censé être deux exemples distincts.

136voto

Eric C Points 1545

L'espace blanc est \s pas \w

^(-?\d+(\.\d+)?),\s*(-?\d+(\.\d+)?)$

Voyez si cela fonctionne

2 votes

J'ai dû utiliser le point au lieu de la virgule : /^(\- ? \d +( \.\d +) ?) hereAdot . endMod \s *(\- ? \d +( \.\d +) ?)$/

2 votes

Il accepte des valeurs en dehors de la fourchette autorisée pour les long et long termes, par exemple 91,181.

1 votes

Cela fonctionne également pour les coordonnées x/y des systèmes de référence spatiale projetés.

22voto

Sampada Points 156

En fait, Alix Axel, la regex ci-dessus est erronée du point de vue des plages de latitude et de longitude.

Les mesures de latitude vont de -90° à +90°. Les mesures de longitude vont de -180° à +180°.

Donc la regex donnée ci-dessous valide plus précisément.
En outre, selon moi, personne ne devrait restreindre le point décimal dans la latitude/longitude.

^([-+]?\d{1,2}([.]\d+)?),\s*([-+]?\d{1,3}([.]\d+)?)$

OR pour Objective C

^([-+]?\\d{1,2}([.]\\d+)?),\\s*([-+]?\\d{1,3}([.]\\d+)?)$

3 votes

Il accepte 99 pour Latitude alors que 99 est hors de portée de -90, +90 et donc invalide.

10voto

Alix Axel Points 63455

Voici une version plus stricte :

^([-+]?\d{1,2}[.]\d+),\s*([-+]?\d{1,3}[.]\d+)$
  • Latitude = -90 -- +90
  • Longitude = -180 -- +180

1 votes

Je crois que {1,2} devrait venir en premier, puis {1,3}.

0 votes

@Arjan : Corrigé, je confonds toujours les deux. Merci !

10voto

user1439929 Points 46

Essayez ça :

^(\()([-+]?)([\d]{1,2})(((\.)(\d+)(,)))(\s*)(([-+]?)([\d]{1,3})((\.)(\d+))?(\)))$

Allez voir sur le site :

http://regexpal.com/

Collez l'expression dans la case du haut, puis mettez des choses comme ceci dans la case du bas :

(80.0123, -34.034)
(80.0123)
(80.a)
(980.13, 40)
(99.000, 122.000)

Décomposition de la Regex :

^                    # The string must start this way (there can't be anything before). 
    (\()             # An opening parentheses (escaped with a backslash).
    ([-+]?)          # An optional minus, or an optional plus.
    ([\d]{1,2})      # 1 or 2 digits (0-9).
    (                # Start of a sub-pattern.
        (            # Start of a sub-pattern.
            (\.)     # A dot (escaped with a backslash).
            (\d+)    # One or more digits (0-9).
            (,)      # A comma.
        )            # End of a sub-pattern.
    )                # End of a sub-pattern.
    (\s*)            # Zero or more spaces.
    (                # Start of a sub-pattern.
        ([-+]?)      # An optional minus, or an optional plus. 
        ([\d]{1,3})  # 1 to 3 digits (0-9).
        (            # Start of a pattern.
            (\.)     # A dot (escaped with a backslash).
            (\d+)    # One or more digits (0-9).
        )?           # End of an optional pattern.
        (\))         # A closing parenthesis (escaped with a backkslash).
    )                # End of a pattern
$                    # The string must end this way (there can't be anything after).

Maintenant, ce que cela ne fait PAS, c'est se limiter à cette gamme :

(-90 to +90, and -180 to +180)

Au lieu de cela, il se limite simplement à cette plage :

(-99 to +99, -199 to +199) 

Mais le but est surtout de décomposer chaque élément de l'expression.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X