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

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.

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”?

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.

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()) + 

"]");
            }
        }
    }
}

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.

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,})+

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.

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

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