Je pense que c'est une question facile, mais je ne parviens pas à trouver une solution simple (disons moins de 10 lignes de code :)
J'ai une String
telle que "thisIsMyString"
et je dois la convertir en String[] {"this", "Is", "My", "String"}
.
Veuillez noter que la première lettre n'est pas en majuscule.
Vous pouvez utiliser une expression rationnelle avec un préfixe positif de largeur nulle. Elle trouve les lettres majuscules mais ne les inclut pas dans le délimiteur:
String s = "thisIsMyString";
String[] r = s.split("(?=\\p{Upper})");
Y(?=X)
correspond à Y
suivi de X
, mais n'inclut pas X
dans match. Donc, (?=\\p{Upper})
correspond à une séquence vide suivie d'une lettre majuscule, et split
l'utilise comme délimiteur.
Voir javadoc pour plus d’informations sur la syntaxe des expressions rationnelles Java.
EDIT: Au fait, cela ne marche pas non plus avec thisIsMyÜberString
. Pour les lettres majuscules non-ASCII, vous avez besoin d'une classe de caractères Unicode majuscule au lieu de POSIX:
String[] r = s.split("(?=\\p{Lu})");
String[] camelCaseWords = s.split("(?=[A-Z])");
Pour tous ceux qui se demandent comment se trouve le motif lorsque la chaîne à scinder peut commencer par un caractère majuscule:
String s = "ThisIsMyString";
String[] r = s.split("(?<=.)(?=\\p{Lu})");
System.out.println(Arrays.toString(r));
donne: [Ceci, est, mon, chaîne]
Puisque String::split
prend une expression régulière, vous pouvez utiliser une prévision:
String[] x = "thisIsMyString".split("(?=[A-Z])");
Essaye ça;
static Pattern p = Pattern.compile("(?=\\p{Lu})");
String[] s1 = p.split("thisIsMyFirstString");
String[] s2 = p.split("thisIsMySecondString");
...
Cette expression régulière se scinde en majuscules, en omettant la première. Cela devrait donc fonctionner pour les cas de chameaux et les cas appropriés.
(?<=.)(?=(\\p{Upper}))
TestText = Test, Text
thisIsATest = this, Is, A, Test