Melhorando um Pattern de EL para obter nomes de pessoas em uma String

8 respostas
Pedrosa

Olá, alguém sabe como poderia melhorar esse Pattern para obter nomes de pessoas no meio de uma String?, estou usando da seguinte forma:

Pattern patternNome = Pattern.compile("[A-ZÀ-Ú]{3,}");
Matcher matcherNome = patternNome.matcher(valor);
String nome = "";
while(matcherNome.find()){
    nome+= valor.substring(matcherNome.start(), matcherNome.end()).trim()+ " ";
}

No caso esses nomes sempre estão em letras maiúsculas e podem vir acentuados, faço esse nome+= pois do jeito que está captura somente o primeiro nome e preciso do sobrenome completo.

8 Respostas

T

Que coisa, um nome não pode ter duas letras? O que ocorre com o sr. “JÔ SOARES”?

Além disso, eu não entendi qual é a sua idéia. A string de entrada é algo como:

“Hoje, o senador GARIBALDI ALVES assumiu a votação da CPMF” - você quer retornar “GARIBALDI ALVES” ou “GARIBALDI ALVES CPMF”?

Pedrosa

Minha frase vem algo assim, e um monte da código HTML no meio, mas isso realmente é o que preciso:

DORIANE OLIVEIRA DA CONCEICAO	376726979999	99.99.99999999-1	27/11/2007	R$ 165,80	Pronto para Recarga

Comi bola realmente existem nomes com 2 letras.

T
import java.util.regex.*;

class PegaNomes {
    public static void main(String[] args) {
        String[] testes = {
        "\"A saúde era um problema que estava resolvido e agora não está mais\", disse o 

ministro do Planejamento, PAULO BERNARDO, depois de se reunir com a ministra da Casa Civil, 

DILMA ROUSSEFF, o ministro da Fazenda, GUIDO MANTEGA, e o mais afetado de todos, JOSÉ GOMES 

TEMPORÃO. Durante o encontro, a piada recorrente era de que o ministro da Saúde tinha 

amanhecido, de repente, R$ 40 bilhões mais pobre. \"Saímos de uma situação em que tudo 

levava a crer que teríamos um acordo histórico para a saúde, em que todos ganhavam, para 

essa realidade desastrosa\", disse TEMPORÃO. \"Foi um processo absolutamente contaminado 

por disputas partidárias.\"",

"\"O Orçamento prevê R$ 500 milhões de obras para o Poder Judiciário. Tem que mexer aí 

também. Não pode cortar só nos parlamentares, tem que ser isonômico\", afirmou JOVAIR 

ARANTES. O líder do PSC, HUGO LEAL (RJ), disse que a tendência é de \"um corte linear em 

todo o Orçamento\". \"Não avalio que o corte possa afetar mais os deputados. Cada um vai 

ter que dar sua cota de sacrifício. É melhor do que tirar muito de um lado e nada do outro, 

preservando, claro, setores essenciais como saúde e educação. Se (o corte) for só em cima 

das emendas, vai ter problema. Ninguém vai aceitar um corte aleatório\", afirmou LEAL.",

"SEUL - Cientistas sul-coreanos clonaram gatos angorá com uma proteína fluorescente que 

permite a eles emitir um brilho quando expostos à luz ultravioleta. A equipe liderada por 

KONG IL-KEUN, especialista em clonagem animal da Universidade Nacional de GYEOUNGSANG, 

informou que os gatos serão utilizados para pesquisas genéticas. "
        };
        Pattern pat = Pattern.compile ("[\\p{Lu}]{2,}([ -][\\p{Lu}]{2,})+");
        // A regra aqui é: só considerar algo como nome se esses padrões estiverem 
        // próximos, ou seja, no máximo com um espaço ou "-" de diferença.
        for (int i = 0; i < testes.length; ++i) {
	    System.out.println ("Teste " + i + ":");
            Matcher mat = pat.matcher (testes[i]);
            while (mat.find()) {
                System.out.println ("[" + testes[i].substring (mat.start(), mat.end()) + 

"]");
            }
        }
    }
}
T

Hum, meu pattern não atende às suas necessidades já que os nomes vêm só no começo.
Mas você pode usar um pattern um pouco diferente ("^[\p{Lu}]{2,}([ -][\p{Lu}]{2,})+") e usar “if” em vez de “while”, já que é para achar só o primeiro.

T

Pergunta - você pode ter algo como “JOSÉ CAETANO D’ÁVILA DE SANT’ANNA?” Se tiver algo assim, em vez de

^[\p{Lu}]{2,}([ -][\p{Lu}]{2,})+

teríamos de usar:

^[\p{Lu}’]{2,}([ -][\p{Lu}’]{2,})+

para incluir tais nomes.

Você tem mais de um espaço no nome? Nesse caso, usar:

^[\p{Lu}’]{2,}([ -]+[\p{Lu}’]{2,})+

T

Ou, como o pessoal sempre diz, a solução mais fácil é procurar onde está o primeiro dígito numérico. Tudo que vier antes dele é um nome e não precisa dessa expressão regular super-complicada.

Pedrosa

Essa sua última funcionou para que serve esse p{Lu}?, valeu cara!

T

“\p{Lu}” é uma forma de descrever qualquer caracter maiúsculo, acentuado ou não. Veja o javadoc de java.util.regex.Pattern.

Criado 14 de dezembro de 2007
Ultima resposta 14 de dez. de 2007
Respostas 8
Participantes 2