Regex: Parse streetname/nombre
C#/.NET 2.0
J'ai besoin d'analyser une chaîne de caractères contenant le nom de la rue et la maison pas de deux valeurs distinctes.
in: "Streetname 1a" out: "streetname" "1a"
"Street name 1a" "street name" "1a"
"Street name 1 a" "street name" "1 a"
Mon premier choix a été de diviser la chaîne où j'ai trouvé un " char, mais qui ne fonctionnera pas pour le second cas.
result[0] = trimmedInput.Substring(0, splitPosition).Trim();
result[1] = trimmedInput.Substring(splitPosition + 1).Trim();
Quelle est la meilleure façon de le faire? Puis-je utiliser les expressions régulières?
Grâce
Où sont stockées les données? Ne pouvez-vous pas juste persister différemment, dans ses préférable format?
OriginalL'auteur thedev | 2011-02-16
Vous devez vous connecter pour publier un commentaire.
^(.+)\s(\S+)$
devrait faire l'affaireEDIT: ce travail est le numéro de la maison ne peut pas contenir des espaces. Sinon, ce problème ne peut être résolu par programmation, puisque le programme ne saura jamais la sémantique de la chaîne de jetons.
Maison adresses sont désordonné et incohérent. J'ai travaillé avec des données d'adresse et honnêtement, si vous n'avez pas les données sous sa forme normalisée, vous êtes fondamentalement vissé.
^(.+)\s(\d+(\s*[^\d\s]+)*)$
va couvrir certains cas de plus, mais un modèle comme ça, c'est une boîte de pandore que si je voyais jamais un.+1 ... je pense que je suis vissé alors
Je crois que mon dernier edit allez passer les 3 tests, mais il est condamné à l'échec à certains autres que vous ne pouvez même pas penser à l'heure actuelle.
la dernière édition passe ces 3 tests... il génère également une valeur sorcière est toujours "un" dans ces cas, pouvons-nous retirer de cette troisième val ?
que voulez-vous dire? Je suppose que vous avez besoin de Groupes[1] et des Groupes[2]
OriginalL'auteur Dyppl
Comme Dyppl dit, les adresses postales sont en désordre. Mais, si votre adresse de données représente les adresses des états-unis et que vous avez l'adresse complète (y compris la ville, l'état, et/ou Code POSTAL) vous pouvez utiliser un service de vérification d'adresse pour analyser (et de vérifier!) et de standardiser les composants. Je travaille pour SmartyStreets, une vérification de l'adresse du fournisseur. Voici un petit exemple en C#, j'ai écrit un temps, que les appels de nos LiveAddress API:
https://github.com/smartystreets/LiveAddressSamples/blob/master/c-sharp/street-address.cs
Voici le résultat de cet exemple (notez que le nom de la rue et numéro principal, sont analysés dans la section "composants" section):
Nous fournissons un absolument gratuit d'abonnement à faible utilisation des utilisateurs. Voici un lien qui explique tous les domaines:
http://wiki.smartystreets.com/liveaddress_api_users_guide#json-responses
EDIT: inclus latitude/longitude champs (nouvellement libérés).
Juste USPS adresses pour l'instant. Découvrez http://www.worldaddresses.com ou http://www.strikeiron.com pour les adresses, traitement de.
Vous pouvez essayer de regex tout ce que vous voulez, mais si vous pouvez obtenir une adresse normalisée de l'objet en arrière à partir d'une adresse de la normalisation des services, il sera très dur, et très difficile de garantir l'exactitude
OriginalL'auteur mdwhatcott
Vous devez définir plus clairement le modèle que vous cherchez, en supposant qu'il en est même un. Il doit y avoir quelques observations générales que vous pouvez faire qui va toujours en attente:
À partir d'un commentaire, le dernier point n'est pas strictement vrai, parce que le nombre & lettre partie du numéro de rue peuvent être séparés par des espaces.
Si vous ne pouvez pas garantir l'ordre du nom de la rue & nombre, et aussi que les mots dans le nom de la rue ne contiennent pas de chiffres, puis je ne suis pas vraiment sûr de ce qui se passe pour vous aider.
La regex suivante devrait couvrir la plupart des cas:
Ensuite, vous avez à prendre en considération " (’).
OriginalL'auteur Quick Joe Smith
Au premier abord, vous devriez essayer de trouver le numéro à l'aide
String.LastIndexOf()
de le couper à une position possible.Ensuite, vous devriez vérifier si des caractères à l'intérieur de ce dernier groupe contient des chiffres comme
splittedValue.Any(c => Char.IsDigit(c));
. Alors, si vous découvrez tous les numéros à l'intérieur de ce dernier groupe, vous pouvez être sûr, que vous avez fait le split correct, mais peut-être qu'il y a des adresses qui ne correspond pas à ce comportement.Mise à jour
Si vous avez vraiment ces bruyantes de données qui doivent être normalisées je pense que vous ne pouvez pas faire quelque chose de mieux qu' @Dyppl dit et l'utilisation de certains compliqué expression régulière qui doit évoluer par les échantillons que vous obtenez qui ne fonctionne pas.
OriginalL'auteur Oliver
C'est en supposant que vous tous, les "adresses" sera formatée dans au moins l'une des façons mentionnées ci-dessus.
Puis couper les deux valeurs.
Je l'ai mise à jour de la regex pour quelque chose qui pourrait fonctionner (c'est à dire exclure les nuber) 🙂
Vous vous rendez compte qu'il y a des noms de rue avec des chiffres en eux, non? Comme, à New York
Oui, je m'en rends compte 🙂 c'est pourquoi j'ai dit "C'est en supposant que vous tous, les "adresses" sera formatée dans au moins l'une des façons mentionnées ci-dessus." Aussi, je pense que tout le monde se rend compte que ce problème est impossible à résoudre étant donné les centaines de formats différents, une adresse peut être dans. Je suis tout simplement en fournissant une solution de facilité dans le cas de l'OP ne doit couvrir les formats qu'il a fournis à titre d'exemples.
la nouvelle regex ne fonctionne pas
OriginalL'auteur Craigt