Comment convertir "HelloWorld"
à "Hello World"
? La division doit se faire sur la base des lettres majuscules, mais doit exclure la première lettre.
Réponses
Trop de publicités?String output = input.replaceAll("(\\p{Ll})(\\p{Lu})","$1 $2");
Cette expression rationnelle recherche une lettre minuscule suivie d'une lettre majuscule et les remplace par la première, un espace et la seconde (en les séparant effectivement par un espace). Elle place chacune d'entre elles dans un groupe de capture ()
afin de pouvoir réutiliser les valeurs de la chaîne de remplacement par le biais de références rétroactives ( $1
y $2
).
Pour trouver les lettres majuscules et minuscules, il utilise \p{Ll}
y \p{Lu}
(au lieu de [a-z]
y [A-Z]
), parce qu'il gère les tous les lettres majuscules et minuscules de la norme Unicode et pas seulement celles de la gamme ASCII ( cette belle explication de l'Unicode dans les regex s'applique également à Java).
Mieux est subjective. Cela nécessite quelques lignes de code supplémentaires :
public static String deCamelCasealize(String camelCasedString) {
if (camelCasedString == null || camelCasedString.isEmpty())
return camelCasedString;
StringBuilder result = new StringBuilder();
result.append(camelCasedString.charAt(0));
for (int i = 1; i < camelCasedString.length(); i++) {
if (Character.isUpperCase(camelCasedString.charAt(i)))
result.append(" ");
result.append(camelCasedString.charAt(i));
}
return result.toString();
}
Cacher cette implémentation laide dans une classe utilitaire et l'utiliser comme une API (cela semble correct du point de vue de l'utilisateur ;) )
String s = "HelloWorldNishant";
StringBuilder out = new StringBuilder(s);
Pattern p = Pattern.compile("[A-Z]");
Matcher m = p.matcher(s);
int extraFeed = 0;
while(m.find()){
if(m.start()!=0){
out = out.insert(m.start()+extraFeed, " ");
extraFeed++;
}
}
System.out.println(out);
empreintes
Hello World Nishant
Si vous ne souhaitez pas utiliser d'expressions régulières, vous pouvez parcourir en boucle les caractères de la chaîne, en les ajoutant à un générateur de chaîne (et en ajoutant un espace au générateur de chaîne si vous rencontrez une majuscule qui n'est pas la première) :
String s = "HelloWorld";
StringBuilder result = new StringBuilder();
for(int i=0 ; i<s.length() ; i++) {
char c = s.charAt(i);
if(i!=0&&Character.isUpperCase(c)) {
result.append(' ');
}
result.append(c);
}