O título praticamente diz tudo. Qual é a maneira mais simples / elegante de converter, em Java, uma string do formato "THIS_IS_AN_EXAMPLE_STRING"
para o formato " ThisIsAnExampleString
"? Eu acho que deve haver pelo menos uma maneira de fazer isso usando String.replaceAll()
e uma regex.
Meus pensamentos iniciais são: acrescente a sequência com um sublinhado ( _
), converta a sequência inteira em minúscula e, em seguida, use replaceAll para converter todos os caracteres precedidos por um sublinhado com sua versão em maiúscula.
Respostas:
Outra opção é usar o Google Guava's
com.google.common.base.CaseFormat
George Hawkins deixou um comentário com este exemplo de uso:
fonte
Dê uma olhada no WordUtils na biblioteca do Apache Commons lang :
Especificamente, o método capitalizeFully (String str, char [] delimitadores) deve fazer o trabalho:
Barra verde!
fonte
Nota : Você precisa adicionar a validação de argumento.
fonte
String result = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, "THIS_IS_AN_EXAMPLE_STRING");
. Consulte javadoc com.google.common.base.CaseFormat .Com o Apache Commons Lang3 lib é muito fácil.
Exemplo:
Dá:
fonte
fonte
Aqui está um trecho de código que pode ajudar:
fonte
Exemplo de Java 1.8 usando Streams
THIS_IS_SOME_TEXT agora é thisIsSomeText
fonte
text.matches( "([a-z]+[a-zA-Z0-9]+)+" )
antes da carcaça do camelo é provavelmente uma solução razoável para o problema da carcaça inferior.Não tenho certeza, mas acho que posso usar menos memória e obter um desempenho confiável fazendo isso, char a char. Eu estava fazendo algo semelhante, mas em loops em threads de segundo plano, então estou tentando isso por enquanto. Eu tive alguma experiência com String.split sendo mais caro do que o esperado. E estou trabalhando no Android e espero que os soluços da GC sejam mais um problema do que o uso da CPU.
Uma dica de que String.split é caro é que sua entrada é um regex (não um caractere como String.indexOf) e retorna uma matriz (em vez de dizer um iterador porque o loop usa apenas uma coisa de cada vez). Além disso, casos como "AB_AB_AB_AB_AB_AB ..." quebram a eficiência de qualquer cópia em massa e, para seqüências longas, usa uma ordem de magnitude mais memória que a sequência de entrada.
Considerando que o loop através de caracteres não tem caso canônico. Então, para mim, a sobrecarga de um regex e matriz desnecessários geralmente parece menos preferível (desistindo da possível eficiência da cópia em massa). Interessado em ouvir opiniões / correções, obrigado.
fonte
Tempos: em mili segundos.
fonte
Você pode usar org.modeshape.common.text.Inflector .
Especificamente:
O artefato do Maven é: org.modeshape: modeshape-common: 2.3.0.Final
no repositório JBoss: https://repository.jboss.org/nexus/content/repositories/releases
Aqui está o arquivo JAR: https://repository.jboss.org/nexus/content/repositories/releases/org/modeshape/modeshape-common/2.3.0.Final/modeshape-common-2.3.0.Final.jar
fonte
Você pode tentar isso também:
fonte
fonte
Este é o programa mais simples para converter para o CamelCase. espero que ajude você ..
fonte
Ele será convertido
Enum Constant
em Camel Case. Seria útil para quem procura essa funcionalidade.fonte
Mais uma solução para isso pode ser a seguinte.
fonte
Invocação como
Tempo de execução: 14 ms
fonte
Um snnipet simples:
fonte
Java 8 para várias cadeias:
fonte
fonte
CaseFormat
não é uma API padrão. Resposta duplicada, se for goiaba.