none
Expressão Regular para Endereço, Numero e Complemento

    Question


  • Por enquanto as variáveis que contém o conteúdo a ser atualizado não estão vindo com os valores corretos.


    Dim cmd_Enderecos As New SqlCommand("SELECT [xx_id], [xx_end], [xx_novo], [xx_num], [xx_comp] FROM [DBCepaHom].[dbo].[AA_End] WHERE [xx_end] IS NOT NULL ORDER BY [xx_end]", connSQL)

    Dim daSQL_Enderecos As New SqlDataAdapter(cmd_Enderecos)

    Dim dtSQL_Enderecos As New DataTable

    'preenche o DataTable

    daSQL_Enderecos.Fill(dtSQL_Enderecos)

    '___________________________________________________________________________

    ' ABERTURA DA CONEXAO BASE SQL SERVER

    connSQL.Open()

    oConnSQL.BeginTrans()

    'inspeo dos dados do resultado da consulta no SQL SERVER

    Dim drSQL_Enderecos As DataRow

    For Each drSQL_Enderecos In dtSQL_Enderecos.Rows

    QtdReg_SQL_Enderecos += 1

    Dim EnderecoResultante As String = String.Empty

    Dim Numero As String = String.Empty '

    Dim Complemento As String = String.Empty

    Dim EnderecoCompleto As String = drSQL_Enderecos(1)

    ' EXPRESSAO REGULAR AJUSTADA
    Dim regex As New Regex("^(RUA|Rua|R.|AVENIDA|Avenida|AV.|TRAVESSA|Travessa|TRAV.|Trav.) ([a-zA-Z_\s]+)[, ]+(\d+)\s?([-/\da-zDA-Z\\ ]+)?$", RegexOptions.IgnoreCase)

    For Each endereco In EnderecoCompleto

    Dim m As Match = regex.Match(endereco)

    EnderecoResultante = String.Format("Endereo: '{0}'", endereco)

    Numero = String.Format("Nmero: '{0}'", m.Groups(3).Value)

    Complemento = String.Format("Complemento: '{0}'", m.Groups(4).Value)

    __________________________________________________________________________


    Testei com debug passo-a-passo e está retornando o seguinte:

    >? EnderecoResultante

    "Endereo: 'A'"

    >? Numero

    "Nmero: ''"

    >? Complemento

    "Complemento: ''"

    No momento, vou precisar apenas destas variáveis sem considerar logradouro e tipo do mesmo.

    O EnderecoResultante terá somente o Endereço SEM Numero e SEM Complemento.



    A seguir, exemplos de endereços (entradas / valores que vem da base de dados) e o retorno que preciso (saídas), tratando essas strings.

    1) RUA FREDERICO DA SILVEIRA PEREZ, 7500

    Saídas:

        EnderecoResultante: RUA FREDERICO DA SILVEIRA PEREZ

       
    Numero: 7500

        Complemento:  -




    2)
    AV. NOVA ZELÂNDIA, 2784

    Saídas:

       
    EnderecoResultante: AV. NOVA ZELÂNDIA

       
    Numero: 2784

        Complemento:  -




    3)
    RUA ÍTALO FERREIRA 735

    Saídas:

       
    EnderecoResultante: 
    RUA ÍTALO FERREIRA 

        Numero: 735

        Complemento:  -



    4)
    RUA EURÍPEDES NETO, 591/634

    Saídas:

       
    EnderecoResultante: 
    RUA ÍTALO FERREIRA 

        Numero: 735

        Complemento:  -



    5) RUA CORONEL JOÃO LOPES Nº 7516 APTO 534

    Saídas:

        EnderecoResultante: RUA CORONEL JOÃO LOPES 

        Numero: 7516

        Complemento:  APTO 534

    6) AV. DAS BROMÉLIAS 573 BL 382

    Saídas:

       
    EnderecoResultante: AV. DAS BROMÉLIAS 

       
    Numero: 573

        Complemento:  BL 382



    Aguardo ajuda para acertar o conteúdo das variáveis (saídas) que são os dados que vem da expressão regular.

    Magno Machado Borba |- Se o post foi util ou resposta nao esqueca de marcar.
    Sunday, March 22, 2009 8:14 PM

Answers

All replies

  •  

    Por favor, alguém que possa colaborar em me ajudar, preciso de ajuda para poder solucionar este tópico.

    Não sei por que dentro do for each, ele nao separa com os valores corretos, quando faz o match.


    Como posso ajustar??



    Aguardo ajuda.

    Magno Machado Borba |- Se o post foi util ou resposta nao esqueca de marcar.
    Friday, March 27, 2009 4:07 PM


  • Pessoal,

    Esclarecendo melhor a minha situação, percebi que no momento do for each a variável endereco só recebe a primeira letra do endereço do campo do banco de dados, sendo assim, como poderia fazer para ele guardar todo o endereço??  

    O que preciso fazer com a variável endereco?


    Consegui visualizar isto checando no Command Window:

    >? EnderecoCompleto.ToString

    "ACESSO MARCELINO BARSQUI, 172"

    >? endereco

    "A"

    >? m.Groups(3).Value

    ""

     

    Pessoal, peço socorro, preciso mesmo resolver isso logo, conto com a colaboração de vocês.


    Segue o código:


     

    ' EXPRESSOES REGULARES PARA TRATAR ENDEREO, NUMERO E COMPLEMENTO. ************************************************

     

    Dim endereco As String = String.Empty

     

    Dim EnderecoResultante As String = String.Empty

     

    Dim Numero As String = String.Empty '

     

    Dim Complemento As String = String.Empty

     

     

    Dim EnderecoCompleto As String = drSQL_Enderecos(1)

     

    ' EXPRESSAO REGULAR AJUSTADA

     

    Dim regex As New Regex("^(RUA|Rua|R.|AVENIDA|Avenida|AV.|TRAVESSA|Travessa|TRAV.|Trav.) ([a-zA-Z_\s]+)[, ]+(\d+)\s?([-/\da-zDA-Z\\ ]+)?$", RegexOptions.IgnoreCase)

     

    For Each endereco In EnderecoCompleto.ToString

     

    Dim m As Match = regex.Match(endereco)

     

    EnderecoResultante =

    String.Format("Endereo: '{0}'", endereco)

    Numero =

    String.Format("Nmero: '{0}'", m.Groups(3).Value)

    Complemento =

    String.Format("Complemento: '{0}'", m.Groups(4).Value)

     


    ' ATUALIZAO DE ENDEREOS *****************************************************************************************************************************

     

    Dim cmd_AtualizaEnderecos As New SqlCommand("UPDATE [DBCepaHom].[dbo].[AA_End] SET [xx_novo] = @xx_novo, [xx_num] = @xx_num, [xx_comp] = @xx_comp WHERE [xx_id] = @xx_id", connSQL)

     

     

    ' Campo ID

    cmd_AtualizaEnderecos.Parameters.AddWithValue(

    "@xx_id", drSQL_Enderecos(0).ToString())

     

    ' Campo Endereo Resultante

    cmd_AtualizaEnderecos.Parameters.AddWithValue(

    "@xx_novo", EnderecoResultante.ToString())

     

     


    ' Campo Nmero

     

    If IsNumeric(Numero) Then

    cmd_AtualizaEnderecos.Parameters.AddWithValue(

    "@xx_num", Numero)

     

    Else

    cmd_AtualizaEnderecos.Parameters.AddWithValue(

    "@xx_num", DBNull.Value)

     

    End If

     

     

    ' Campo Complemento

    cmd_AtualizaEnderecos.Parameters.AddWithValue(

    "@xx_comp", Complemento.ToString())

     

     

    Dim daSQL_AtualizaEnderecos As New SqlDataAdapter(cmd_AtualizaEnderecos)

     

    Dim dtSQL_AtualizaEnderecos As New DataTable

     

     

    'preenche o DataTable

    daSQL_AtualizaEnderecos.Fill(dtSQL_AtualizaEnderecos)

     

     

    Next

     

     


    Qualquer ajuda será bem vinda!!


    Magno Machado Borba |- Se o post foi util ou resposta nao esqueca de marcar.
    Tuesday, March 31, 2009 7:57 PM
  • Olá,

    Baseado na sua RE fiz uma outro um pouco mais elaborada, porém ainda não está perfeita, e nem era esse meu intuito.

    O que usei para construi foi o Regular Expression Basic Syntax Reference
    e o Notepad++ para ir testando.

    (^(RUA|Rua|R.|AVENIDA|Avenida|AV.|TRAVESSA|Travessa|TRAV.|Trav.)[\w\s][^0-9|,]*)(((,\s|(N|n)º\s)([0-9/]+))|(\s?([0-9/]+)))+(.*?)$

    []'s
    Monday, April 06, 2009 6:17 PM


  • Obrigado mesmo!!

    Não cheguei a testar ainda porque resolvi implementando manualmente empregando a lógica, usando um padrão de Endereços e critérios para separar corretamente em cada respectiva parte.

    Encontrei como solução para o Tratamento de Endereços, tratando cada entrada de Endereço vinda da base de dados considerando a separação nas variáveis:

    A) primeiraParte - o Endereço sem número e sem complemento

    B) Numero.

    C) Complemento.

    Outros detalhes estão esclarecidos neste link:

    Posições de Elementos no Array
    http://social.msdn.microsoft.com/Forums/pt-BR/vsvbasicpt/thread/7e7692f9-b0d7-4397-8288-3e3b2314c82e


    Outro link relacionado, porém sugerindo a possibilidade de desenvolver com regular expressions:

    Tratamento de Endereços
    http://social.msdn.microsoft.com/Forums/pt-BR/transactsqlpt/thread/f20017a6-2e56-4f9a-8ac2-756f48289f47/


    Abraços, bons estudos e desenvolvimento.

     


    Magno Machado Borba |- Se o post foi util ou resposta nao esqueca de marcar.
    • Marked as answer by Magno Machado Friday, April 10, 2009 4:28 PM
    Friday, April 10, 2009 4:23 PM
  • Boa tarde, acho que encontrei o problema do código original.

     

     For Each drSQL_Enderecos In dtSQL_Enderecos.Rows
      Dim EnderecoResultante As String = String.Empty
      Dim Numero As String = String.Empty ' 
      Dim Complemento As String = String.Empty
      Dim EnderecoCompleto As String = drSQL_Enderecos(1)
    
      ' EXPRESSAO REGULAR AJUSTADA
      Dim regex As New Regex("^(RUA|Rua|R.|AVENIDA|Avenida|AV.|TRAVESSA|Travessa|TRAV.|Trav.) ([a-zA-Z_\s]+)[, ]+(\d+)\s?([-/\da-zDA-Z\\ ]+)?$", RegexOptions.IgnoreCase)
    
      'For Each endereco In EnderecoCompleto
      Dim m As Match = regex.Match(EnderecoCompleto)
    
      EnderecoResultante = String.Format("Endereco: '{0}'", m.Groups(2).Value)
      Numero = String.Format("Numero: '{0}'", m.Groups(3).Value)
      Complemento = String.Format("Complemento: '{0}'", m.Groups(4).Value)
     Next

     

    Abraços

     

    Vilmar Pinho

    Thursday, October 07, 2010 5:35 PM