2009-03-16 5 views
2

유틸리티 서비스 주소를 다루는 응용 프로그램은 현재 사용자가 주소 부분을 분리하고 데이터베이스에 추가하기 전에 적절한 필드에 넣을 수있을만큼 충분히 알도록하고 있습니다. 직선 알파벳순 정렬은 주소에 사전 방향이있을 때 항상 올바르지 않기 때문에 정렬 목적으로이 방법을 수행해야합니다. 예를 들어, 현재 사용자가 서비스 주소 (123) N 주 세인트을 넣어 원한다면, 그들은 그것을 입력하면 같은 : = 123 서비스 주소의 부분을 분류하는 정규식?

  • 전 방향 = N
  • 거리 이름

    • 거리 번호 = 홈페이지
    • 스트리트 형 = 세인트는

    나는 스플릿 (Split) 기능을 사용하여 각 부분을 반복하여 부분으로이 주소를 분리하는 시도했습니다. 내가 지금까지 가지고있는 것은 아래와 같다 :

    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 Function
    나는이 방법이 성가신, 천천히, 그리고 심지어 우키 한 주소가 주어 졌을 때 완전히 틀린 것을 알았다. 나는 여기서 뭘 하려는지 정규 표현식에 대한 좋은 응용 프로그램이 될 것이라고 궁금하네요? 틀림없이 나는 이전에 어떤 정규식을 사용 해본 적이 없으며 그 점에서 전체 초보자입니다.

    도움을 주셔서 감사합니다. :)

    편집 - 필자는 정규 표현식뿐만 아니라 파서가 필요해 보인다. 누구든지 .NET에서 좋은 주소 파서 라이브러리를 알고 있습니까? 우리 자신의 카드를 쓰는 것은 지금 카드에 없으며 카드가 나온다면 뒤의 버너에게 보내질 것입니다.

  • +0

    미리보기는 항상 한 글자입니까? –

    +0

    @Stuart B - 아니요, 때로는 사람들이 "123 South Main St"와 같은 문자를 입력합니다 –

    +0

    @Heather -이 어려운 문제는 확실히 더 털이 있습니다! 당신은 분명히 받아 들여질 수있는 사전 목록을 정의해야합니다. –

    답변

    1

    나에 대한 (쉽게) 테스트에 주소가 설정되어 있지 않지만, 여기에 적어도 시도하는 무언가이다. 그것은 장소에서 너무 관대하거나 다른 사람들에서 너무 제한적 일지 모르지만 그것을 조정할 수 있어야합니다. 당신은 확실히 사전 형 목록을 조정할 필요가 있지만, 이 명시 적으로 지정해야합니다. 또한 정규 표현식 옵션이 대소 문자를 구분하지 않도록 설정해야합니다.

    ^(?<StreetNumber>[0-9]+)\s*(?<Predirection>(n)|(s)|(e)|(w)|(north)|(south)|(east)|(west))?\s+(?<StreetName>[a-z0-9 -'.]+)\s+(?<StreetType>[a-z.]+)$ 
    

    NoahD가 제안한 것처럼 실제로 가능하다면이를 주소 파서로 위임하는 것이 좋습니다. 아마. NET에서 뭔가를 찾으려면 약간의 파고를해야 할 것이지만, 아무것도 찾을 수 없다면, 나는 정규 표현식을 사용하겠다.

    편집 : do'h는, \는 없습니다/s의

    편집, S : 더 의미 그룹화에 정규식 변경되었습니다. 다음과 같이 그룹 값에 액세스 할 수 있습니다.

    string address = "123 n main st"; 
    Regex regex = new Regex("insert the regex above here", RegexOptions.IgnoreCase); 
    MatchCollection matches = regex.Matches(address); 
    
    foreach(Match match in matches) 
    { 
        string streetAddress = matches.Groups["StreetAddress"]; 
        string predirection = matches.Groups["Predirection"]; 
        string streetName = matches.Groups["StreetName"]; 
        string streetType = matches.Groups["StreetType"]; 
    } 
    
    +0

    음 ... 생각합니다. 나는 정규식이 무엇을했는지 전에는 이해하지 못했다. 당신이 말했듯이, 주소 파서는 아마 내가 필요한 것입니다. 이 표현식을 .NET의 Regex 객체에 꽂으면 입력 내용의 유효성을 검사 할 때 매우 효과적이었습니다. 도와 줘서 고마워. :) –

    +0

    사실, 정규식을 사용하여 문자열의 일부를 추출 할 수 있습니다. 나는 일종의이 글을 불규칙하게 썼다. 그래서 어느 그룹을 이끌어 낼지를 아는 것이 더 힘들다. 그냥 "C# Regex Groups"또는 무언가에 대한 Google 검색을 수행합니다. –

    +0

    주소 파서는 geocoder.us에 하나 있다고 생각합니다. 그래도 돈을 내야할지 모르겠다. –

    0

    당신은 예를 들어 Geo::StreetAddress::US

    사용하여 펄에서이 작업을 수행 할 수 있습니다 :

     
        my $hashref = Geo::StreetAddress::US->parse_address(
           "1600 Pennsylvania Ave, Washington, DC"); 
    

    +0

    VB.NET에서 너무 나쁘다. 정확히 내가 찾고있는 것이기 때문이다. .NET에서 파서 라이브러리가 있는지 여부는 알 수 없습니까? –

    +0

    사실, 이것이 더 나은 스레드 일 수 있습니다. http://stackoverflow.com/questions/16413/parse-usable-street-address-city-state-zip-from-a-string – NoahD

    관련 문제