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