Java + Expressão Regular

Fala galera!
Não sei se esse tópico se enquadraria em Java Avançado, mas aí vai.

Tô precisando fazer um saneamento numa base de dados na tabela de clientes. A tabela de Clientes não está normalizada e temos hoje a necessidade de melhorar (normalizar) os campos de endereço.

Para o campo logradouro estou querendo aplicar expressão regular e tentar recuperar um padrão (que mais se repita) para separar o campo em tipo logradouro, logradouro, número e complemento.

Alguém já precisou fazer isso?
Alguém tem alguma luz que possa me adiantar?

Grato a todos!

Cacilda, esse tipo de coisa (que é normalização de dados) é bem chatinha mesmo.
Acho que provavelmente é melhor você gerar um arquivo-texto (que deve conter milhares de endereços) e tentar (talvez usando Perl, Python, awk ou mesmo Java) achar algumas expressões regulares que consigam fazer o que você quer.
Você vai ver que isso vai dar um bom trabalho, e alguns endereços vão sobrar que devem ser normalizados “manualmente”.
Por exemplo, o tipo de logradouro “Rua” pode ser:

R
r
Rua
R.
R .
rúa
roa
rrua
ru.
r:

e assim por diante. (Não se esqueça que quem cadastrou os endereços pode nem saber português direito, portanto você tem de se precaver contra eventuais abreviaturas esquisitas mas perfeitamente válidas. )

Uma idéia para esse logradouro aew, vc poderia fazer assim:


String tudo = "Rua são Bento, 524, próx. ao Fórum";

        String rua,num,comp = "";

        comp = tudo.replaceAll("([\\D])+[\\d]+([\\D])", "$1");

        num = tudo.replaceAll("(\\D)", "");

        rua = tudo.replaceAll("(\\d)+(\\D)", "");

implementei rapidamente uma idéia aqui pra vc oks.

[quote=Algebra]Uma idéia para esse logradouro aew, vc poderia fazer assim:


String tudo = "Rua são Bento, 524, próx. ao Fórum";

        String rua,num,comp = "";

        comp = tudo.replaceAll("([\\D])+[\\d]+([\\D])", "$1");

        num = tudo.replaceAll("(\\D)", "");

        rua = tudo.replaceAll("(\\d)+(\\D)", "");

implementei rapidamente uma idéia aqui pra vc oks.[/quote]

Vou ter q fazer um algoritmo pra testar alguns padrões de endereços que estão sendo usados. Sei que são uma porrada, mas vou tentar descobrir a maioria. Vou utilizar a tua ideia Algebra, pra tentar chegar num melhor resultado.
O que sobrar vai pro estagiário fazer na mão mesmo!

Exemplo de endereço: String logradouro = "Rua Nome Da Rua, 110/808"
Como eu faço pra testar esse padrão utilizando ER?

boolean teste = Pattern.matches("(\\d)+(\\D)", logradouro)

:?: Qual expressão regular eu teria que fazer pra saber se logradouro se encaixa no padrão?

Encontrei alguns padrões de endereços:

[code]/**
* ### Padrões de Logradouros ###
* p1 - R. Pedro Americo, 110
* p2 - R. Pedro Americo 110 apt 808 | R. Pedro Americo, 110, 808
* p3 e p4 - R GAL RAMIRO NORONHA - CASA 52
* p5 - R FELIPE NERI, 239, | R FELIPE NERI, 239/
* p6 - R 20 DE SETEMBRO, 1487 / 63
* p7 - Rua Professor Marcos Martini, 1075, 32B
*/
public static final HashMap<Long,String> LISTA_PADRAO_LOGRADOURO = new LinkedHashMap<Long, String>();

static {
   
    LISTA_PADRAO_LOGRADOURO.put(new Long(1), "[\\D]+[\\d]+");
    LISTA_PADRAO_LOGRADOURO.put(new Long(2), "[\\D]+[\\d]+[\\D/\\D]+[\\d]+");
    LISTA_PADRAO_LOGRADOURO.put(new Long(3), "[\\D]+[casa\\D]+[\\d]+");
    LISTA_PADRAO_LOGRADOURO.put(new Long(4), "[\\D]+[cs\\D]+[\\d]+");
    LISTA_PADRAO_LOGRADOURO.put(new Long(5), "[\\D]+[\\d]+[\\D]+");
    LISTA_PADRAO_LOGRADOURO.put(new Long(6), "[(\\D)|(\\d)]+[,][\\s]+[\\d]+[(\\D)|(\\d)]+");
    LISTA_PADRAO_LOGRADOURO.put(new Long(7), "[\\D]+[\\d]+[(\\D)|(\\d)]+");
    
}[/code]

Agora vou criar uma rotina para montar novamente esses endereços.

Pé no saco isso!