Eu gostaria de escrever um método que converta o CamelCase em um nome legível por humanos.
Aqui está o caso de teste:
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
tornaPDF Loader
?Respostas:
Isso funciona com seus casos de teste:
Aqui está um chicote de teste:
Ele usa a expressão regular de comprimento zero com lookbehind e forwardforward para descobrir onde inserir espaços. Basicamente, existem três padrões, e eu costumo
String.format
reuni-los para torná-los mais legíveis.Os três padrões são:
UC atrás de mim, UC seguido por LC na minha frente
não UC atrás de mim, UC na minha frente
Carta atrás de mim, sem letra na minha frente
Referências
Perguntas relacionadas
Usando lookarounds correspondentes a comprimento zero para dividir:
fonte
%s
" 's são espaços reservados para osString.format(String format, args...)
argumentos. Você também pode chamar pelo índice:String.format("%$1s|%$2s|%$3s", ...
relaceAll
também que eu queira adicionar divisão se a string ".
" tiver isso.Você pode fazer isso usando
org.apache.commons.lang.StringUtils
fonte
A solução elegante e mais curta:
fonte
assert
pergunta, a capitalização não é desejada.Se você não gosta de regex "complicado" e não se preocupa com eficiência, usei este exemplo para obter o mesmo efeito em três estágios.
Ele passa em todos os casos de teste acima, incluindo aqueles com dígitos.
Como eu disse, isso não é tão bom quanto usar a expressão regular em alguns outros exemplos aqui - mas alguém pode achar útil.
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
O Regex a seguir pode ser usado para identificar as letras maiúsculas nas palavras:
Corresponde a todas as letras maiúsculas, que são éteres após uma letra ou dígito que não sejam maiúsculas ou são seguidas por uma letra minúscula e todos os dígitos após uma letra.
Como inserir um espaço antes deles está além das minhas habilidades em Java =)
Editado para incluir a caixa de dígitos e a caixa do PDF Loader.
fonte
L
noPDFLoader
?|
como "ou". Bem ... talvez seja ... eu já vi pior = /Eu acho que você terá que percorrer a string e detectar alterações de minúsculas para maiúsculas, maiúsculas para minúsculas, alfabético para numérico, numérico para alfabético. Em todas as alterações detectadas, insira um espaço com uma exceção: em uma alteração de maiúscula para minúscula, insira o espaço um caractere antes.
fonte
Isso funciona no .NET ... otimizar ao seu gosto. Adicionei comentários para que você possa entender o que cada peça está fazendo. (RegEx pode ser difícil de entender)
fonte
Para o registro, aqui está uma versão Scala quase (*) compatível:
Depois de compilado, ele pode ser usado diretamente do Java se o scala-library.jar correspondente estiver no caminho de classe.
(*) falha na entrada
"GL11Version"
para a qual retorna"G L11 Version"
.fonte
Peguei o Regex de poligenelubricants e o transformei em um método de extensão em objetos:
Isso transforma tudo em uma frase legível. Faz um ToString no objeto passado. Em seguida, ele usa o Regex fornecido por poligenelubricants para dividir a string. Em seguida, abaixa cada palavra, exceto a primeira e quaisquer acrônimos. Achei que poderia ser útil para alguém por aí.
fonte
Eu não sou um ninja regex, então eu iria percorrer a string, mantendo os índices da posição atual sendo verificados e a posição anterior. Se a posição atual for uma letra maiúscula, insiro um espaço após a posição anterior e incremento cada índice.
fonte
http://code.google.com/p/inflection-js/
Você pode encadear os métodos String.underscore (). Humanize () para pegar uma sequência CamelCase e convertê-la em uma sequência legível por humanos.
fonte