2010-09-20 4 views
36

Je pense que cela est une question facile, mais je ne suis pas en mesure de trouver une solution simple (par exemple, moins de 10 lignes de code :)Java: Éclate une chaîne quand une lettre majuscule se trouve

J'ai un String tels que "thisIsMyString" et je dois le convertir en un String[] {"this", "Is", "My", "String"}.

S'il vous plaît noter la première lettre est en majuscule pas.

Répondre

88

Vous pouvez utiliser une expression rationnelle avec zéro avant positive largeur - il trouve des lettres majuscules, mais ne pas les inclure dans delimiter:

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

Y(?=X) matchs Y suivi par X, mais ne comprend pas X en rencontre. Donc (?=\\p{Upper}) correspond à une séquence vide suivi d'une lettre majuscule, et il utilise split comme séparateur.

Voir javadoc pour plus d'informations sur la syntaxe Java regexp. Par ailleurs, il ne fonctionne pas avec thisIsMyÜberString aussi. Pour les lettres en majuscules non-ASCII vous avez besoin d'une classe de caractères majuscules Unicode au lieu de POSIX un:

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

+1, vous avez été (en quelques secondes), + explication, + la classe supérieure prédéfinie :) – Bozho

+1

Sachez simplement que si le caractère supérieur est la dernière dans la chaîne que vous ne recevez une chaîne vide pour le bit au-delà, par exemple splitting "H2W" retournera {"", "2"} où "" est le bit avant "H", et "2" est le bit au milieu. Normalement, ce n'est pas un problème, mais cela peut casser les hypothèses sur le nombre de pièces retournées. – locka

+0

@locka: Y a-t-il un moyen de contourner cela, autre que de vérifier explicitement? – Jeremy

16
String[] camelCaseWords = s.split("(?=[A-Z])"); 
+1

Ne fonctionne pas pour "thisIsMyÜberString". – jarnbjo

+1

axtavt a déjà donné une réponse correcte à la question de Guido, alors pourquoi répondre deux fois? Votre réponse est fausse, donc je l'ai downvoted et ai indiqué pourquoi. – jarnbjo

+0

@jarnbjo sa réponse initialement ne fonctionnait pas pour tréma. – Bozho

5

Depuis String::split prend une expression régulière, vous pouvez utiliser un look-ahead:

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

Essayez ce;

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

... 
10

Pour toute personne qui se demande comment le motif est quand la chaîne de diviser peut commencer par un caractère majuscule:

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

donne: [Ce, est, mon, String]

+0

Ceci n'est pas ** une réponse à la question originale.Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire en dessous de son message - vous pouvez toujours commenter vos propres messages, et une fois que vous aurez suffisamment de [réputation] (http://stackoverflow.com/help/whats-reputation) vous pourrez être capable de [commenter sur n'importe quel post] (http://stackoverflow.com/help/privileges/comment). – DavidPostill

+0

Merci pour l'addition! – serj

0

Cette regex se divisera en majuscules, en omettant la première. Donc, cela devrait fonctionner pour camel-cas et bon-cas.

(?<=.)(?=(\\p{Upper})) 

TestText = Test, Text 
thisIsATest = this, Is, A, Test 
Questions connexes