Me gustaría escribir un método que convierta CamelCase en un nombre legible para humanos.
Aquí está el caso de prueba:
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
conviertePDF Loader
?Respuestas:
Esto funciona con sus casos de prueba:
Aquí hay un arnés de prueba:
Utiliza expresiones regulares de coincidencia de longitud cero con mirar hacia atrás y hacia adelante para encontrar dónde insertar espacios. Básicamente hay 3 patrones, y los uso
String.format
para juntarlos y hacerlos más legibles.Los tres patrones son:
UC detrás de mí, UC seguido de LC delante de mí
no UC detrás de mí, UC delante de mí
Carta detrás de mí, sin carta delante de mí
Referencias
Preguntas relacionadas
Usando búsquedas de coincidencia de longitud cero para dividir:
fuente
%s
" son marcadores de posición para losString.format(String format, args...)
argumentos. También puede llamar por índice:String.format("%$1s|%$2s|%$3s", ...
relaceAll
tampoco quiero agregar división si la cadena tiene ".
" en eso.Puedes hacerlo usando
org.apache.commons.lang.StringUtils
fuente
La solución ordenada y más corta:
fuente
assert
pregunta, no se desea la capitalización.Si no te gustan las expresiones regulares "complicadas" y no te preocupa en absoluto la eficiencia, entonces he usado este ejemplo para lograr el mismo efecto en tres etapas.
Pasa todos los casos de prueba anteriores, incluidos los que tienen dígitos.
Como digo, esto no es tan bueno como usar la única expresión regular en algunos otros ejemplos aquí, pero alguien podría encontrarlo útil.
fuente
Puede usar org.modeshape.common.text.Inflector .
Específicamente:
El artefacto de Maven es: org.modeshape: modeshape-common: 2.3.0.Final
en el repositorio JBoss: https://repository.jboss.org/nexus/content/repositories/releases
Aquí está el archivo JAR: https://repository.jboss.org/nexus/content/repositories/releases/org/modeshape/modeshape-common/2.3.0.Final/modeshape-common-2.3.0.Final.jar
fuente
La siguiente expresión regular se puede utilizar para identificar las mayúsculas dentro de las palabras:
Coincide con cada letra mayúscula, es decir, después de una letra o dígito que no es mayúscula o seguida de una letra minúscula y cada dígito después de una letra.
Cómo insertar un espacio antes de ellos está más allá de mis habilidades Java =)
Editado para incluir el caso de dígitos y el caso de PDF Loader.
fuente
L
dePDFLoader
?|
como "o". Bueno ... tal vez es ... He visto algo peor = /Creo que tendrá que iterar sobre la cadena y detectar cambios de minúsculas a mayúsculas, mayúsculas a minúsculas, alfabético a numérico, numérico a alfabético. Sin embargo, en cada cambio que detecte, inserte un espacio con una excepción: en un cambio de mayúsculas a minúsculas, inserte el espacio un carácter antes.
fuente
Esto funciona en .NET ... optimízalo a tu gusto. Agregué comentarios para que puedas entender lo que está haciendo cada pieza. (RegEx puede ser difícil de entender)
fuente
Para el registro, aquí hay una versión de Scala casi (*) compatible:
Una vez compilado, se puede usar directamente desde Java si el scala-library.jar correspondiente está en el classpath.
(*) falla para la entrada
"GL11Version"
por la que regresa"G L11 Version"
.fuente
Tomé el Regex de polygenelubricants y lo convertí en un método de extensión en objetos:
Esto convierte todo en una oración legible. Hace un ToString en el objeto pasado. Luego, usa la expresión regular dada por los polieleubricantes para dividir la cadena. Luego ToLowers cada palabra, excepto la primera palabra y cualquier acrónimo. Pensé que podría ser útil para alguien por ahí.
fuente
No soy un ninja regex, por lo que iteraría sobre la cadena, manteniendo los índices de la posición actual que se verifica y la posición anterior. Si la posición actual es una letra mayúscula, insertaría un espacio después de la posición anterior e incrementaría cada índice.
fuente
http://code.google.com/p/inflection-js/
Puede encadenar los métodos String.underscore (). Humanize () para tomar una cadena CamelCase y convertirla en una cadena legible para humanos.
fuente