105 votes

Regex pour convertir des CamelCase en camel_case en java

Je comprends pourquoi la sortie souhaitée n'est pas donnée pour convertir en utilisant REGEX une chaîne comme FooBar en Foo_Bar qui donne plutôt Foo_Bar_. J'aurais pu faire quelque chose avec String substring(0, string.length() - 2) ou simplement remplacer le dernier caractère, mais je pense qu'il y a une meilleure solution à un tel scénario.

Voici le code :

String regex = "([A-Z][a-z]+)";
String replacement = "$1_";

"CamelCaseToSomethingElse".replaceAll(regex, replacement); 

/*
outputs: Camel_Case_To_Something_Else_
desired output: Camel_Case_To_Something_Else
*/

Question : Vous cherchez un moyen plus soigné d'obtenir la sortie souhaitée ?

74voto

clevertension Points 3847

lier les minuscules et les majuscules comme deux groupes,ce sera ok

public  class Main
{
    public static void main(String args[])
    {
        String regex = "([a-z])([A-Z]+)";
        String replacement = "$1_$2";
        System.out.println("CamelCaseToSomethingElse"
                           .replaceAll(regex, replacement)
                           .toLowerCase());
    }
}

44voto

Sandeep Vaid Points 1347

Vous pouvez utiliser l'extrait de code ci-dessous :

String replaceAll = key.replaceAll("(.)(\\p{Upper})", "$1_$2").toLowerCase();

7voto

radzimir Points 173

Je ne peux pas fournir RegEx, ce serait incroyablement complexe de toute façon.

Essayez cette fonction avec la reconnaissance automatique des acronymes.

Malheureusement, Guava lib ne détecte pas automatiquement les acronymes en majuscules, donc "bigCAT" serait converti en "BIG_C_A_T"

/**
 * Convert to UPPER_UNDERSCORE format detecting upper case acronyms
 */
private String upperUnderscoreWithAcronyms(String name) {
    StringBuffer result = new StringBuffer();
    boolean begin = true;
    boolean lastUppercase = false;
    for( int i=0; i < name.length(); i++ ) {
        char ch = name.charAt(i);
        if( Character.isUpperCase(ch) ) {
            // is start?
            if( begin ) {
                result.append(ch);
            } else {
                if( lastUppercase ) {
                    // test if end of acronym
                    if( i+1<name.length() ) {
                        char next = name.charAt(i+1);
                        if( Character.isUpperCase(next) ) {
                            // acronym continues
                            result.append(ch);
                        } else {
                            // end of acronym
                            result.append('_').append(ch);
                        }
                    } else {
                        // acronym continues
                        result.append(ch);
                    }
                } else {
                    // last was lowercase, insert _
                    result.append('_').append(ch);
                }
            }
            lastUppercase=true;
        } else {
            result.append(Character.toUpperCase(ch));
            lastUppercase=false;
        }
        begin=false;
    }
    return result.toString();
}

5voto

Brett Ryan Points 4905

Pourquoi ne pas simplement faire correspondre le caractère précédent comme n'étant pas un début de ligne $ ?

String text = "CamelCaseToSomethingElse";
System.out.println(text.replaceAll("([^_A-Z])([A-Z])", "$1_$2"));

Notez que cette version est sûre pour être effectuée sur quelque chose qui est déjà camel cased.

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