web-dev-qa-db-fra.com

Java: scinder la chaîne lorsqu'une lettre majuscule est trouvée

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.

41
Guido

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})");
97
axtavt
String[] camelCaseWords = s.split("(?=[A-Z])");
17
Bozho

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]

11
Mulder

Puisque String::split prend une expression régulière, vous pouvez utiliser une prévision:

String[] x = "thisIsMyString".split("(?=[A-Z])");
5
RoToRa

Essaye ça;

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

...
0
Spigolo Vivo

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
0
The Shoe Shiner