Problema com String.split()

Essa é bobinha, mas tem horas que o cérebro trava :smiley:

Eu tenho uma String que é nada mais do que o nome de uma classe, seguindo as convenções Sun de nomenclatura, p.e.:

nome.do.pacote.tools.NomeDaClasse

Como eu faço uma expressão regular no split() dessa string, ou uso outro método qualquer, para conseguir isso:

Nome Da Classe

Alguma idéia? :slight_smile:

import java.util.regex.*;
import java.io.*;

public class Splitter {
    public static String [] split(String str, String separador) throws Exception {
        Pattern p = Pattern.compile(separador); // para . use [.]+
	String[] resultado = p.split(str);
	return resultado;    
	}
    // main para testes
    public static void main(String [] args) {
	    try {
		    String [] as = split("Pacote.Nome.da.Classe", "[.]+");
		    for (int i = 0; i< as.length; i++)
			    System.out.println(as[i]);
	    } catch (Exception e) {
		    System.out.println(e);
	    }
    }
}

não sei usar expressões regulares direito ,então vou sugerir outros metodos
primeiro ,você pode usar o StringTokenizer para separar nome.do.pacote.tools.NomeDaClasse em tokens ,indicando que o separador é o “.”
com isso ,você pega o ultimo token , que vai ser o “NomeDaClasse”
pronto ,agora sabendo que a classe Character tem o metodo isLowerCase que te retorna um booleando indicando se o caracter é minusculo ou não ,vc pode interar a string ,e pegar as posições dos caracteres maiusculos
bom ,foi uma solução ,não sei se foi a mais elegante :slight_smile:

Pessoal, valeu pela força :slight_smile:

O Rafael Steil acabou me dando a dica de usar o isUpperCase, e o código acabou assim:

private static String beautifyClass(String line) { int idx = line.lastIndexOf("."); if (idx == -1) { return beautifyName(line); } else { return beautifyName(line.substring(idx + 1)); } }

[code]private static String beautifyName(String line) {
char[] chars = line.toCharArray();
StringBuffer ret = new StringBuffer();

	for (int i = 0; i < chars.length; i++) {
		char c = chars[i];
		if (Character.isUpperCase(c)) {
			if (i > 0) {
				ret.append(" " + c);
			} else {
				ret.append(c);
			}
		} else {
			ret.append(c);
		}
	}
	return ret.toString();
}[/code]