Java: Dividir string quando uma letra maiúscula é encontrada

Acho que esta é uma pergunta fácil, mas não consigo encontrar uma solução simples (digamos, menos de 10 linhas de código 🙂

Eu tenho uma String como "thisIsMyString" e eu preciso convertê-lo para um String[] {"this", "Is", "My", "String"} .

Por favor note que a primeira letra não é maiúscula.

Você pode usar um regexp com lookahead positivo de largura zero – ele encontra letras maiúsculas, mas não as inclui no delimitador:

 String s = "thisIsMyString"; String[] r = s.split("(?=\\p{Upper})"); 

Y(?=X) corresponde a Y seguido de X , mas não inclui X em correspondência. Então (?=\\p{Upper}) corresponde a uma sequência vazia seguida por uma letra maiúscula, e a split usa como um delimitador.

Veja javadoc para mais informações sobre a syntax regexp do Java.

EDIT: By the way, ele não funciona com thisIsMyÜberString também. Para letras maiúsculas não-ASCII, você precisa de uma class de caracteres maiúsculos Unicode em vez de POSIX um:

 String[] r = s.split("(?=\\p{Lu})"); 
 String[] camelCaseWords = s.split("(?=[AZ])"); 

Para qualquer um que se pergunte como o padrão é quando a string a ser dividida pode começar com um caractere maiúsculo:

 String s = "ThisIsMyString"; String[] r = s.split("(?<=.)(?=\\p{Lu})"); System.out.println(Arrays.toString(r)); 

dá: [This, Is, My, String]

Como o String::split tem uma expressão regular, você pode usar uma olhada antecipada:

 String[] x = "thisIsMyString".split("(?=[AZ])"); 

Tente isso;

 static Pattern p = Pattern.compile("(?=\\p{Lu})"); String[] s1 = p.split("thisIsMyFirstString"); String[] s2 = p.split("thisIsMySecondString"); ... 

Esse regex será dividido em Caps, omitindo o primeiro. Por isso deve funcionar para o caso de camelo e caso apropriado.

 (?<=.)(?=(\\p{Upper})) TestText = Test, Text thisIsATest = this, Is, A, Test