175 Stimmen

Wie konvertiere ich CamelCase in Java in für Menschen lesbare Namen?

Ich möchte eine Methode schreiben, die CamelCase in einen für Menschen lesbaren Namen umwandelt.

Hier ist der Testfall:

public void testSplitCamelCase() {
    assertEquals("lowercase", splitCamelCase("lowercase"));
    assertEquals("Class", splitCamelCase("Class"));
    assertEquals("My Class", splitCamelCase("MyClass"));
    assertEquals("HTML", splitCamelCase("HTML"));
    assertEquals("PDF Loader", splitCamelCase("PDFLoader"));
    assertEquals("A String", splitCamelCase("AString"));
    assertEquals("Simple XML Parser", splitCamelCase("SimpleXMLParser"));
    assertEquals("GL 11 Version", splitCamelCase("GL11Version"));
}

368voto

polygenelubricants Punkte 362173

Dies funktioniert mit Ihren Testfällen:

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])"
      ),
      " "
   );
}

Hier ist ein Test-Kabelbaum:

    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) + "]");
    }

Es verwendet Null-Längen-Matching-Regex mit Lookbehind und Lookforward, um herauszufinden, wo Leerzeichen eingefügt werden sollen. Im Grunde gibt es 3 Muster, und ich verwende String.format um sie zusammenzufügen, damit sie besser lesbar sind.

Die drei Muster sind:

UC hinter mir, UC gefolgt von LC vor mir

  XMLParser   AString    PDFLoader
    /\        /\           /\

non-UC hinter mir, UC vor mir

 MyClass   99Bottles
  /\        /\

Buchstabe hinter mir, Nicht-Buchstabe vor mir

 GL11    May5    BFG9000
  /\       /\      /\

Referenzen

Verwandte Fragen

Verwendung von Null-Längen-Übereinstimmungs-Lookarounds zur Aufteilung:

154voto

Ralph Punkte 114913

Sie können dies tun mit org.apache.commons.lang.StringUtils

StringUtils.join(
     StringUtils.splitByCharacterTypeCamelCase("ExampleTest"),
     ' '
);

28voto

Sahil Chhabra Punkte 9561

Die saubere und kurze Lösung :

StringUtils.capitalize(StringUtils.join(StringUtils.splitByCharacterTypeCamelCase("yourCamelCaseText"), StringUtils.SPACE)); // Your Camel Case Text

12voto

jlb83 Punkte 1748

Wenn Sie keine "komplizierten" Regexe mögen und Ihnen die Effizienz völlig egal ist, dann habe ich dieses Beispiel verwendet, um den gleichen Effekt in drei Schritten zu erreichen.

String name = 
    camelName.replaceAll("([A-Z][a-z]+)", " $1") // Words beginning with UC
             .replaceAll("([A-Z][A-Z]+)", " $1") // "Words" of only UC
             .replaceAll("([^A-Za-z ]+)", " $1") // "Words" of non-letters
             .trim();

Er besteht alle oben genannten Testfälle, einschließlich derjenigen mit Ziffern.

Wie gesagt, das ist nicht so gut wie die Verwendung des einen regulären Ausdrucks in einigen anderen Beispielen hier - aber jemand könnte es durchaus nützlich finden.

6voto

Hendy Irawan Punkte 18986

Sie können verwenden org.modeshape.common.text.Inflector .

Konkret:

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

Das erste Wort wird großgeschrieben, Unterstriche werden in Leerzeichen umgewandelt und nachstehende "_id" sowie alle übergebenen entfernbaren Token werden entfernt.

Maven-Artefakt ist: org.modeshape:modeshape-common:2.3.0.Final

auf JBoss Repository: https://repository.jboss.org/nexus/content/repositories/releases

Hier ist die JAR-Datei: https://repository.jboss.org/nexus/content/repositories/releases/org/modeshape/modeshape-common/2.3.0.Final/modeshape-common-2.3.0.Final.jar

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X