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.
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.
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.