Java: división de cadena cuando se encuentra una letra mayúscula

Creo que esta es una pregunta fácil, pero no puedo encontrar una solución simple (digamos, menos de 10 líneas de código 🙂

Tengo un String como "thisIsMyString" y necesito convertirlo a String[] {"this", "Is", "My", "String"} .

Tenga en cuenta que la primera letra no está en mayúscula.

Puede usar una expresión regular con una búsqueda positiva de ancho cero: encuentra letras mayúsculas pero no las incluye en el delimitador:

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

Y(?=X) coincide con Y seguido de X , pero no incluye X en el partido. Entonces (?=\\p{Upper}) coincide con una secuencia vacía seguida de una letra mayúscula, y split usa como un delimitador.

Consulte javadoc para obtener más información sobre la syntax de expresiones regulares de Java.

EDITAR: por cierto, tampoco funciona con thisIsMyÜberString . Para las letras mayúsculas que no son ASCII, necesita una clase de caracteres en mayúsculas Unicode en lugar de POSIX:

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

Para cualquiera que se pregunte cómo es el patrón cuando el String para dividir podría comenzar con un carácter en mayúscula:

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

da: [Esto, Es, Mi, Cadena]

Dado que String::split toma una expresión regular, puede usar una búsqueda anticipada:

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

Prueba esto;

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

Esta expresión regular se dividirá en mayúsculas, omitiendo la primera. Por lo tanto, debería funcionar para camel-case y proper-case.

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