6
votes

Diplômes minutes secondes (DMS) Regex

J'ai une expression régulière que je veux correspondre à une paire de latitude / longitude dans une variété de modes, par exemple

   "([-|\\+]?\\d{1,3}[d|D|\u00B0|\\s](\\s*\\d{1,2}['|\u2019|\\s])?"
 + "(\\s*\\d{1,2}[\"|\u201d|\\s])?\\s*([N|n|S|s|E|e|W|w])?\\s?)"


7 commentaires

Votre dernier exemple est pas une paire lat / longue. Il n'y a pas de telle chose que 123 * Nord.


@John: Je sais que c'est le problème. Ce ne correspond pas des paires correspondantes. En ce qui concerne une coordonnée valide, c'est un autre problème.


@Alexwien: Non préoccupé par la décimale pour le moment et ne pas être trop préoccupé par les chiffres, je suis juste préoccupé par le format.


Je ne sais pas ce qui ne va pas avec votre regex, mais le problème est que vous essayez d'écrire toute la regex en une fois, ce qui le rend horriblement difficile de détecter l'erreur et / ou de le maintenir.


@ 0A0d: IDEONE.COM/JYAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVvv la tête n'explose pas dans le processus.


@nhahtdh: merci! J'essaie toujours de voir ce qui fonctionne mieux. Je vous ferai savoir ce que je décide de faire.


Je viens de trouver une solution pour mes cas d'utilisation particuliers. Il ne semble pas gérer tous les vôtres. However, given how I approached it, you might find it a useful place to start: Stackoverflow.com/questions/18321779/...


3 Réponses :


1
votes

Généralement, je ne pense pas que c'est une bonne approche. Dans votre interface, essayez d'avoir des coordonnées DMS dans un format spécifique.
L'utilisateur doit entrer dans ce domaine dans 3 champs de texte distincts.

En outre, cette regex n'est pas très maintenue.

Il y a beaucoup plus de possibilités de noter une coordonnée DMS, Vous ne pouvez même pas imaginer. Les humains sont créatifs.

EG:

mettre n, s en

Ou: Nord, 157 degrés 50 min 55,796 sec
ou: de Wiki: le NGS dit maintenant en 1993 que le point était 21-18-02.54891 N 157-50-45.90280 W


2 commentaires

Oui, cela est vrai, cependant, cet utilisateur a une gamme souhaitée d'options. Je suis au courant des limitations.


Ensuite, laissez l'utilisateur choisir parmi un ensemble de notations X DMS et envoyer le dmsnotationID avec les coordonnées DMS. Autrefois, cela se retrouvera dans le chaos.



0
votes

Je ne suis pas un assistant, mais avec vos formats dont vous auriez besoin d'avoir une sorte de convention pour laquelle une paire vient en premier (probablement latitude) si vous faites une analyse d'une seule zone de texte.

De là, vous avez six champs numériques (DEG, MIN, SEC pour chacun, éventuellement avec un point décimal), deux signes (+ ou - pour chacun) et jusqu'à deux hémisphères (un pour chacun).

Autant que je puisse le constater, l'analyse de ces 8 à 10 champs de votre contribution se produirait dans le même ordre chaque fois que si vous n'avez demandé que la latitude est la première et la longitude secondaire. Le reste des symboles (sauvegarder le ou les points décimaux) peut être traité essentiellement en tant que séparateurs.

Est-ce que cela facilite la tâche?


0 commentaires

11
votes

Eh bien, pour une chose, vous remplissez vos ensembles de caractères avec un tas de caractères de tuyaux inutiles - une alternance est impliquée dans un [] code> paire. Nettoyage supplémentaire: + code> n'a pas besoin d'être échappé dans une classe de caractères. Votre expression régulière semble aborder un énoncé de problème plus important que vous ne nous avez dit - vous ne mentionne aucune mention de d code> ou d code> comme caractère correspondable. Et vous avez fait à peu près la moitié du dos de votre regex facultatif. Sortir de ce que je pense que votre déclaration de problème d'origine est, j'ai construit l'expression régulière suivante:

$


4 commentaires

La seule chose qu'elle ne le fait pas (et ne le fera pas) est d'appliquer que la première coordonnée correspond à la seconde dans le style. C'est trop de trop demander d'expressions régulières. -> Il est possible de le faire sans trop d'effort - vérifiez mon code dans le commentaire à la question. Je vérifie même la coordonnée pour m'assurer qu'elle est dans la plage valide.


Oui, mais les vôtres utilisent trois expressions régulières et doivent vérifier chacun d'entre eux. Il y a des arguments là-bas pour les enfermer avec une alternance, mais ce n'est toujours pas vraiment une excellente expression régulière. Le meilleur choix ici est de voir s'il s'agit d'une paire formatée Lat / Lon, puis d'extraire les valeurs et de vérifier les erreurs sur celles-ci.


Ce n'est toujours pas vraiment une excellente expression régulière - je ne comprends pas comment vous jugez "super" ici. Performance - Ouais, peut ne pas être super. Mais être succinct n'est pas un très bon critère pour cela. Le meilleur choix ici est de voir s'il s'agit d'une paire formatée Lat / Lon, puis d'extraire les valeurs et de vérifier la vérification des erreurs sur ceux-ci. Il y a des avantages et des inconvénients à l'utilisation d'un candidat détendu (et extraire) et un Strict Regex (obtenez directement un jeton valide) - ne peut pas dire sans regarder les données.


Modifié l'expression régulière pour soutenir les degrés décimaux aussi .. ^ ([+ -]? \ D {1,3} \ *? \ S + \ d {1,2} '? \ S + \ d {1,2 } + "? [NSEW]? | \ D {1,3} (: \ d {2}) {2} \. \ D [nsw] \ s *) {1,2} $ | \ D {1,3} (. \ D {1,9})