22 votes

Insérer un espace avant la majuscule

Comment convertir "HelloWorld" à "Hello World" ? La division doit se faire sur la base des lettres majuscules, mais doit exclure la première lettre.

65voto

Joachim Sauer Points 133411
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).

5voto

Andreas_D Points 64111

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 ;) )

3voto

Nishant Points 22758
    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

1voto

berry120 Points 21945

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);
}

0voto

vz0 Points 11605

Pseudocode :

String source = ...;
String result = "";

// FIXME: check for enf-of-source

for each letter in source {
    while current letter not uppercase {
        push the letter to result;
        advance one letter;
    }
    if not the first letter {
        push space to result;
    }
    push the letter to result;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X