Ich möchte eine Methode schreiben, die CamelCase in einen für Menschen lesbaren Namen konvertiert.
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"));
}
PDFLoader
zum BeispielPDF Loader
?Antworten:
Dies funktioniert mit Ihren Testfällen:
Hier ist ein Testgeschirr:
Es verwendet einen übereinstimmenden regulären Ausdruck mit der Länge Null mit Lookbehind und Lookforward, um herauszufinden, wo Leerzeichen eingefügt werden sollen. Grundsätzlich gibt es 3 Muster, die ich
String.format
zusammenstelle, um sie besser lesbar zu machen.Die drei Muster sind:
UC hinter mir, UC gefolgt von LC vor mir
Nicht-UC hinter mir, UC vor mir
Brief hinter mir, kein Brief vor mir
Verweise
Verwandte Fragen
Verwenden von übereinstimmenden Lookarounds mit Nulllänge zum Teilen:
quelle
%s
" sind Platzhalter für dieString.format(String format, args...)
Argumente. Sie können auch per Index anrufen:String.format("%$1s|%$2s|%$3s", ...
relaceAll
Ich möchte Split hinzufügen, wenn String ".
" enthält.Sie können es mit tun
org.apache.commons.lang.StringUtils
quelle
Die saubere und kürzere Lösung:
quelle
assert
Teil der Frage gezeigt, ist eine Großschreibung nicht erwünscht.Wenn Sie "komplizierte" Regexs nicht mögen und sich überhaupt nicht um Effizienz kümmern, habe ich dieses Beispiel verwendet, um den gleichen Effekt in drei Stufen zu erzielen.
Es besteht alle oben genannten Testfälle, einschließlich der mit Ziffern.
Wie gesagt, dies ist nicht so gut wie die Verwendung des einen regulären Ausdrucks in einigen anderen Beispielen hier - aber jemand könnte es nützlich finden.
quelle
Sie können org.modeshape.common.text.Inflector verwenden .
Speziell:
Maven-Artefakt ist: org.modeshape: modeshape-common: 2.3.0.Final
im 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
quelle
Der folgende Regex kann verwendet werden, um die Großbuchstaben in Wörtern zu identifizieren:
Es entspricht jedem Großbuchstaben, dh Äther nach einem Nicht-Großbuchstaben oder einer Ziffer oder gefolgt von einem Kleinbuchstaben und jeder Ziffer nach einem Buchstaben.
Das Einfügen eines Leerzeichens vor ihnen liegt außerhalb meiner Java-Kenntnisse =)
Bearbeitet, um den Ziffern- und den PDF Loader-Fall einzuschließen.
quelle
L
in passenPDFLoader
?|
als "oder" lesen . Nun ... vielleicht ist es ... ich habe Schlimmeres gesehen = /Ich denke, Sie müssen über die Zeichenfolge iterieren und Änderungen von Kleinbuchstaben in Großbuchstaben, Großbuchstaben in Kleinbuchstaben, alphabetisch in numerisch, numerisch in alphabetisch erkennen. Bei jeder Änderung, die Sie feststellen, fügen Sie ein Leerzeichen ein, mit einer Ausnahme: Bei einem Wechsel von Groß- zu Kleinbuchstaben fügen Sie das Leerzeichen ein Zeichen zuvor ein.
quelle
Dies funktioniert in .NET ... nach Ihren Wünschen optimieren. Ich habe Kommentare hinzugefügt, damit Sie verstehen, was jedes Stück tut. (RegEx kann schwer zu verstehen sein)
quelle
Für die Aufzeichnung ist hier eine fast (*) kompatible Scala-Version:
Einmal kompiliert, kann es direkt aus Java verwendet werden, wenn sich die entsprechende scala-library.jar im Klassenpfad befindet.
(*) Es schlägt für die Eingabe fehl,
"GL11Version"
für die es zurückgibt"G L11 Version"
.quelle
Ich habe den Regex aus Polygenschmierstoffen genommen und daraus eine Erweiterungsmethode für Objekte gemacht:
Dies macht alles zu einem lesbaren Satz. Es führt einen ToString für das übergebene Objekt durch. Dann wird der von Polygenschmierstoffen gegebene Regex verwendet, um die Saite zu teilen. Dann verringert es jedes Wort mit Ausnahme des ersten Wortes und aller Akronyme. Ich dachte, es könnte für jemanden da draußen nützlich sein.
quelle
Ich bin kein Regex-Ninja, daher würde ich über die Zeichenfolge iterieren und die Indizes der aktuellen Position und der vorherigen Position beibehalten. Wenn die aktuelle Position ein Großbuchstabe ist, würde ich nach der vorherigen Position ein Leerzeichen einfügen und jeden Index erhöhen.
quelle
http://code.google.com/p/inflection-js/
Sie können die Methoden String.underscore (). Humanize () verketten , um eine CamelCase-Zeichenfolge in eine für Menschen lesbare Zeichenfolge zu konvertieren.
quelle