166 votes

Comment puis-je convertir CamelCase en noms lisible en Java ?

Je tiens à écrire une méthode qui convertit un nom lisible par l’homme du CamelCase.

Voici le scénario de test :

349voto

polygenelubricants Points 136838

Cela fonctionne avec votre cas de tests:

static String splitCamelCase(String s) {
   return s.replaceAll(
      String.format("%s|%s|%s",
         "(?<=[A-Z])(?=[A-Z][a-z])",
         "(?<=[^A-Z])(?=[A-Z])",
         "(?<=[A-Za-z])(?=[^A-Za-z])"
      ),
      " "
   );
}

Voici un harnais de test:

    String[] tests = {
        "lowercase",        // [lowercase]
        "Class",            // [Class]
        "MyClass",          // [My Class]
        "HTML",             // [HTML]
        "PDFLoader",        // [PDF Loader]
        "AString",          // [A String]
        "SimpleXMLParser",  // [Simple XML Parser]
        "GL11Version",      // [GL 11 Version]
        "99Bottles",        // [99 Bottles]
        "May5",             // [May 5]
        "BFG9000",          // [BFG 9000]
    };
    for (String test : tests) {
        System.out.println("[" + splitCamelCase(test) + "]");
    }

Il utilise de longueur nulle mise en correspondance avec lookbehind et lookforward de trouver l'endroit où insérer des espaces. Fondamentalement, il existe 3 modèles, et je l'utilise String.format pour les mettre ensemble pour le rendre plus lisible.

Les trois modèles sont:

UC derrière moi, UC suivie par LC en face de moi

  XMLParser   AString    PDFLoader
    /\        /\           /\

non-UC derrière moi, UC en face de moi

 MyClass   99Bottles
  /\        /\

Lettre derrière moi, non de la lettre en face de moi

 GL11    May5    BFG9000
  /\       /\      /\

Références

Questions connexes

À l'aide de longueur nulle correspondant lookarounds à split:

137voto

Ralph Points 42744

Vous pouvez le faire en utilisant``

11voto

jlb83 Points 103

Si vous n’aimez de regex « compliqué » et ne sont pas du tout dérangé sur l’efficacité, alors que j’ai utilisé cet exemple pour obtenir le même effet en trois étapes.

Elle passe tous les cas de test ci-dessus, y compris ceux contenant des chiffres.

Comme je le dis, ce n’est pas aussi bon qu’en utilisant l’expression régulière un dans quelques autres exemples ici - mais quelqu'un pourrait bien s’avérer utile.

6voto

Hendy Irawan Points 4635

Vous pouvez utiliser org.modeshape.commun.texte.Inflecteur.

Plus précisément:

String humanize(String lowerCaseAndUnderscoredWords,
    String... removableTokens) 

Met en majuscule la première parole souligne dans des espaces et des bandes de fuite "_id" et fourni amovible jetons.

Artefact Maven est: org.modeshape:modeshape-commune:2.3.0.Final

sur JBoss référentiel: https://repository.jboss.org/nexus/content/repositories/releases

Voici le fichier JAR: https://repository.jboss.org/nexus/content/repositories/releases/org/modeshape/modeshape-common/2.3.0.Final/modeshape-common-2.3.0.Final.jar

1voto

Jens Points 14829

L’expression régulière suivante peut servir à identifier les capitales à l’intérieur des mots :

Il correspond à chaque lettre majuscule, qui est l’éther après un non-majuscule ou un chiffre ou suivis d’une minuscule et chaque chiffre après une lettre.

Comment insérer un espace devant eux est au-delà de mes compétences Java =)

Révisé pour inclure l’affaire chiffre et le chargeur de PDF.

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