2012-02-27 6 views
1

Écriture d'une expression régulière pour aider à traiter les adresses de rue. Cependant, je ne sais pas si regex est la bonne façon de résoudre ce problème.Regex avec une grande quantité de "ou"

J'ai une adresse qui ressemble à ceci:

7829 Hollywood Ave 

Je voudrais écrire un regex qui dit ce (pseudo -ode):

match a NUMBER then ONE OR MORE WORDS then a STREET TYPE 

En javascript , cette regex ressemblerait à ceci:

/^\d+\s+.*(\sAve|\sStreet|\sSt.|..800 MORE ABBREVIATIONS!...)/ig 

Comme vous pouvez le voir, parce qu'il y a 800+ postal street "type" abbreviations, cette regex serait très grande. Je devrais le générer en utilisant le code informatique, ce qui est correct, mais je ne suis pas sûr que ce soit un bon moyen de résoudre ce genre de problème.

Je pourrais voir ce problème arriver au point où je veux écrire une regex qui tente de faire correspondre un nom de rue avec un dans une base de données. Alors je ne vois vraiment pas comment une regex standard pourrait fonctionner dans cette situation:

match a NUMBER then **A STREET NAME IN A DATABASE** then a STREET TYPE 

Toute contribution est appréciée!

+0

J'ai vécu dans quatre endroits où votre reg reg échouerait! – epascarello

+1

Même pour votre expression rationnelle existante, je déplacerais le '\ s' de tous les cas OR et le mettre une fois juste avant le' ('- c'est une économie de 1600 caractères ... – nnnnnn

+0

@nnnnnnn - Bon appel –

Répondre

3

Si toutes les adresses étaient aussi simples que <number> <name> <type> la vie serait très simple - mais ils ne sont pas, donc ce n'est pas le cas.

Les adresses de rue sont trop complexes pour une seule expression régulière, par ex. 5/45 East 51st St ou 215-217 Long Island Way. Vous devez soit: le décomposer et analyser les parties, demander à l'utilisateur de saisir l'adresse dans des champs spécifiques, ou simplement accepter ce qu'il vous donne.

+0

Malheureusement, je n'ai aucun contrôle sur la façon dont le l'utilisateur a mis l'adresse. –

+0

Il vous reste donc à analyser l'entrée ou simplement à accepter ce qu'elle vous donne. Un RegExp peut aider avec tokenising mais l'analyse sera manuelle. – RobG

+1

De plus, si vous avez affaire à des adresses internationales, les choses deviennent encore plus complexes. Certains pays mettent le numéro à la fin de la ligne de rue. Certains endroits n'ont pas de numéro du tout. Certains noms de rue ont un numéro. Tous les noms de rues n'ont pas de type. (Certains endroits ne nomment pas les rues non plus, mais c'est un problème que vous pouvez ignorer.) –

1

Vous pouvez capturer le type de rue et ensuite vérifier si le contenu capturé est dans la liste des types de rue.

Le regex deviendrait:

/^\d+\s+.*\s+(.*) 

ou

/^\d+\s+.*\s+(?P<streettype>.*)

1

Utiliser des groupes de capture. Je ne suis pas sûr de JS, mais en java que vous faites:

/^(\d+)\s+(.*)(\w+)/ig

Et vous pouvez obtenir le contenu des groupes entre parenthèses (avec Matcher.getGroup (int)).

Ensuite, vous faites correspondre ces chaînes à votre base de données.

Quoi qu'il en soit ... pourquoi? Les types de rue le justifient peut-être, mais restreindre les noms de rue ne fait qu'ajouter du travail et constitue un inconvénient pour l'utilisateur (si le nom de la rue n'est pas exactement celui de votre base de données ou si votre base de données n'est pas suffisamment mise à jour). Voulez-vous que l'utilisateur mette sa direction? Si l'utilisateur ne le souhaite pas, il peut fournir de fausses données. L'utilisateur veut que vous ayez sa direction? Alors vous pouvez avoir confiance que l'utilisateur sera en mesure de l'écrire correctement ...

+0

Mon cas d'utilisation est très différent de celui que vous supposez. Ceci n'est pas lié à la restriction de l'entrée d'un utilisateur. L'objectif final est de prendre les données d'adresse qui ont des erreurs et de corriger les erreurs. –

+0

Les groupes de capture de JavaScript ressemblent beaucoup à Java. Cependant, sur la question de savoir si oui ou non valider l'entrée de l'utilisateur, je ne suis pas d'accord. Les meilleurs systèmes détectent les erreurs dans les entrées de l'utilisateur et, plutôt que d'échouer silencieusement ou simplement de calculer une mauvaise réponse, informer l'utilisateur qu'il a fait l'erreur, suggérant éventuellement des corrections. Google et de nombreux autres sites populaires offrent l'achèvement des requêtes, et les navigateurs Office et Web offrent une vérification orthographique. Si vous voulez concevoir un bon logiciel, vous devez vous conformer aux attentes de vos utilisateurs. Et les utilisateurs s'attendent à ce que le logiciel signale les erreurs et propose de les corriger. –

+1

@AdamMihalcin Je suis assez sûr que le taux d'erreur des utilisateurs qui échouent tant en écrivant leur propre adresse que vous ne pouvez pas leur envoyer de courrier est assez faible pour compenser l'effort de maintien de ce code. Et introduit plus de problèmes lorsque l'adresse n'est pas répertoriée, vous voulez utiliser le système dans d'autres pays, etc. Et je pense que les utilisateurs sont stupides, mais juste dans une certaine mesure ... – SJuan76

Questions connexes