L'application que je suis en train d'écrire traite des adresses de services publics, et en ce moment je force l'utilisateur de connaître assez pour séparer les parties de l'adresse et de les mettre dans les champs appropriés avant d'ajouter à la base de données. Cela doit être fait de cette manière à des fins de tri parce qu'un tri alphabétique direct n'est pas toujours correct lorsqu'il y a une pré-direction dans l'adresse. Par exemple, en ce moment, si l'utilisateur a voulu mettre l'adresse de service 123 N Main St, ils entreraient comme:Expression régulière pour catégoriser les parties d'une adresse de service?
- rue Number = 123
- Pré direction = N
- Nom Rue = principal
- rue type = St
J'ai essayé de séparer cette adresse dans ses parties en utilisant la fonction Split et itérer chaque partie. Ce que j'ai jusqu'ici est ci-dessous:
Public Shared Function ParseServiceAddress(ByVal Address As String) As String() 'this assumes a valid address - 101 N Main St South Dim strResult(5) As String '0=st_num, 1=predir, 2=st_name, 3=st_type, 4=postdir Dim strParts() As String Dim strSep() As Char = {Char.Parse(" ")} Dim i As Integer Dim j As Integer = 0 Address = Address.Trim() strParts = Address.Split(strSep) 'split using spaces For i = 0 To strParts.GetUpperBound(0) If Integer.TryParse(strParts(i), j) Then 'this is a number, is it the house number? If i = 0 Then 'we know this is the house number strResult(0) = strParts(i) Else 'part of the street name strResult(2) = strResult(2) & " " & strParts(i) End If Else Select Case strParts(i).ToUpper() Case "TH", "ND" 'know this is part of the street name strResult(2) = strResult(2) & strParts(i) Case "NORTH", "SOUTH", "EAST", "WEST", "N", "S", "E", "W" 'is this a predirection? If i = 1 Then strResult(1) = strParts(i) ElseIf i = strParts.GetUpperBound(0) Then 'this is the post direction strResult(4) = strParts(i) Else 'part of the name strResult(2) = strResult(2) & strParts(i) End If Case Else If i = strParts.GetUpperBound(0) Then 'street type strResult(3) = strParts(i) Else 'part of the street name strResult(2) = strResult(2) & " " & strResult(i) End If End Select End If Next i Return strResult End FunctionJ'ai trouvé que cette méthode était lourde, lente, et même totalement erronée lorsqu'on lui donnait une adresse bancale. Je me demande si ce que j'essaie de faire ici serait une bonne application pour une expression régulière? Certes, je n'ai jamais utilisé regex dans quelque chose avant et je suis un débutant total à cet égard.
Merci d'avance pour toute aide. :)
Édition - Semble de plus en plus comme je vais avoir besoin d'un analyseur et pas seulement regex. Est-ce que quelqu'un sait de bonnes bibliothèques d'analyseurs d'adresses dans .NET? Ecrire le nôtre n'est tout simplement pas dans les cartes en ce moment, et serait envoyé à l'arrière-plan si cela arrivait à cela.
La direction est-elle toujours une lettre? –
@Stuart B - Non, parfois les gens les tapent comme "123 South Main St" –
@Heather - cela rend définitivement ce problème difficile encore plus poilu! Vous devrez certainement avoir une liste définie de prédirections acceptables. –