El título lo dice todo. ¿Cuál es la forma más simple / elegante de convertir, en Java, una cadena del formato "THIS_IS_AN_EXAMPLE_STRING"
al formato " ThisIsAnExampleString
"? Me imagino que debe haber al menos una forma de hacerlo usando String.replaceAll()
y una expresión regular.
Mis pensamientos iniciales son: anteponer la cadena con un guión bajo ( _
), convertir toda la cadena a minúscula y luego usar replaceAll para convertir cada carácter precedido por un guión bajo con su versión en mayúscula.
Respuestas:
Otra opción es usar Google Guava's
com.google.common.base.CaseFormat
George Hawkins dejó un comentario con este ejemplo de uso:
fuente
Echa un vistazo a WordUtils en el idioma de Apache Commons biblioteca :
Específicamente, el método capitalizeFully (String str, char [] delimiters) debería hacer el trabajo:
Barra verde!
fuente
Nota : debe agregar la validación de argumentos.
fuente
String result = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, "THIS_IS_AN_EXAMPLE_STRING");
. Ver com.google.common.base.CaseFormat javadoc .Con Apache Commons Lang3 lib es muy fácil.
Ejemplo:
Da:
fuente
fuente
Aquí hay un fragmento de código que podría ayudar:
fuente
Ejemplo de Java 1.8 usando Streams
THIS_IS_SOME_TEXT ahora es thisIsSomeText
fuente
text.matches( "([a-z]+[a-zA-Z0-9]+)+" )
antes de la carcasa de camello es probablemente una solución razonable para el problema de la carcasa inferior.No estoy seguro, pero creo que puedo usar menos memoria y obtener un rendimiento confiable al hacerlo char-by-char. Estaba haciendo algo similar, pero en bucles en subprocesos de fondo, así que estoy intentando esto por ahora. He tenido cierta experiencia con String.split, que es más caro de lo esperado. Y estoy trabajando en Android y espero que el hipo de GC sea más un problema que el uso de la CPU.
Una pista de que String.split es costoso es que su entrada es una expresión regular (no un carácter como String.indexOf) y devuelve una matriz (en lugar de decir un iterador porque el bucle solo usa una cosa a la vez). Además, casos como "AB_AB_AB_AB_AB_AB ..." rompen la eficiencia de cualquier copia masiva, y para cadenas largas, use un orden de magnitud más memoria que la cadena de entrada.
Mientras que recorrer los caracteres no tiene un caso canónico. Entonces, para mí, la sobrecarga de una expresión regular y una matriz innecesarias generalmente parece menos preferible (luego renunciar a la posible eficiencia de copia masiva). Interesado en escuchar opiniones / correcciones, gracias.
fuente
Tiempos: en milisegundos.
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
Puedes probar esto también:
fuente
fuente
Este es el programa más simple para convertir en CamelCase. Espero que te ayude..
fuente
Se convertirá
Enum Constant
en Camel Case. Sería útil para cualquiera que esté buscando tal funcionalidad.fuente
Una solución más a esto puede ser la siguiente.
fuente
Invocación como
Tiempo de ejecución: 14 ms
fuente
Un simple snnipet:
fuente
Java 8 para cadenas múltiples:
fuente
fuente
CaseFormat
No es API estándar. Respuesta duplicada si es guayaba.