J'aimerais écrire une méthode qui convertit CamelCase en un nom lisible par l'homme.
Voici le cas de test:
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
devient-ilPDF Loader
?Réponses:
Cela fonctionne avec vos cas de test:
Voici un harnais de test:
Il utilise une expression régulière de correspondance de longueur nulle avec lookbehind et lookforward pour trouver où insérer des espaces. Fondamentalement, il y a 3 modèles, et j'utilise
String.format
pour les assembler pour le rendre plus lisible.Les trois modèles sont:
UC derrière moi, UC suivie de LC devant moi
non-UC derrière moi, UC devant moi
Lettre derrière moi, non-lettre devant moi
Références
Questions connexes
Utilisation de lookarounds de correspondance de longueur nulle pour diviser:
la source
%s
" sont des espaces réservés pour lesString.format(String format, args...)
arguments. Vous pouvez également appeler par index:String.format("%$1s|%$2s|%$3s", ...
relaceAll
plus que je souhaite ajouter une division si la chaîne contient ".
".Vous pouvez le faire en utilisant
org.apache.commons.lang.StringUtils
la source
La solution nette et plus courte:
la source
assert
question, la capitalisation n'est pas souhaitée.Si vous n'aimez pas les expressions régulières "compliquées" et que vous n'êtes pas du tout préoccupé par l'efficacité, alors j'ai utilisé cet exemple pour obtenir le même effet en trois étapes.
Il réussit tous les cas de test ci-dessus, y compris ceux avec des chiffres.
Comme je l'ai dit, ce n'est pas aussi bon que d'utiliser une seule expression régulière dans d'autres exemples ici - mais quelqu'un pourrait bien la trouver utile.
la source
Vous pouvez utiliser org.modeshape.common.text.Inflector .
Plus précisément:
L'artefact Maven est: org.modeshape: modeshape-common: 2.3.0.Final
sur le référentiel JBoss: 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
la source
Le Regex suivant peut être utilisé pour identifier les majuscules à l'intérieur des mots:
Il correspond à chaque lettre majuscule, c'est-à-dire à l'éther après une lettre ou un chiffre non majuscule ou suivi d'une lettre minuscule et de chaque chiffre après une lettre.
Comment insérer un espace devant eux dépasse mes compétences Java =)
Modifié pour inclure le cas des chiffres et le cas du chargeur PDF.
la source
L
dansPDFLoader
?|
comme "ou". Eh bien ... peut-être que c'est ... j'ai vu pire = /Je pense que vous devrez itérer sur la chaîne et détecter les changements de minuscules à majuscules, majuscules à minuscules, alphabétiques à numériques, numériques à alphabétiques. À chaque changement, vous détectez insérer un espace à une exception près: lors d'un changement de majuscule à minuscule, vous insérez l'espace un caractère avant.
la source
Cela fonctionne dans .NET ... optimisez à votre goût J'ai ajouté des commentaires pour que vous puissiez comprendre ce que fait chaque pièce. (RegEx peut être difficile à comprendre)
la source
Pour mémoire, voici une version Scala presque (*) compatible:
Une fois compilé, il peut être utilisé directement depuis Java si le scala-library.jar correspondant se trouve dans le chemin de classe.
(*) il échoue pour l'entrée
"GL11Version"
pour laquelle il retourne"G L11 Version"
.la source
J'ai pris le Regex de polygenelubricants et l'ai transformé en une méthode d'extension sur les objets:
Cela transforme tout en une phrase lisible. Il effectue un ToString sur l'objet passé. Ensuite, il utilise l'expression régulière donnée par les lubrifiants polygéniques pour diviser la chaîne. Ensuite, il abaisse chaque mot à l'exception du premier mot et des acronymes. J'ai pensé que cela pourrait être utile pour quelqu'un là-bas.
la source
Je ne suis pas un ninja regex, donc je vais itérer sur la chaîne, en gardant les index de la position actuelle en cours de vérification et la position précédente. Si la position actuelle est une lettre majuscule, j'insérerais un espace après la position précédente et incrémenterais chaque index.
la source
http://code.google.com/p/inflection-js/
Vous pouvez chaîner les méthodes String.underscore (). Humanize () pour prendre une chaîne CamelCase et la convertir en une chaîne lisible par l'homme.
la source