Pular para o conteúdo principal

Converter camelCase e snake_case

O Conversor de maiúsculas e minúsculas reescreve identificadores entre camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE e mais nove, no seu navegador. A conversão é trivial; a parte difícil é dividir a entrada em palavras — XMLHttpRequest são três palavras, user2fa são três, e um conversor que erra isso produz saída que ninguém quer.

Só local
Entrada (um identificador por linha)
0 B1 linhaLin. 1, Col. 1
camelCase
 
PascalCase
 
snake_case
 
CONSTANT_CASE
 
kebab-case
 
Train-Case
 
dot.case
 
path/case
 
Primeira maiúscula
 
Formato De Título
 
minúsculas
 
MAIÚSCULAS
 
aLtErNaDo
 
iNVERSO
 

Como funciona o Converter camelCase e snake_case?

Toda convenção de nomenclatura é a mesma lista de palavras renderizada de forma diferente, então converter entre elas é um problema — dividir a entrada em palavras — seguido de uma junção trivial. Os conversores diferem inteiramente no primeiro passo.

Três fronteiras de palavra, em ordem de frequência com que passam despercebidas

A transição de minúscula para maiúscula é a óbvia: userName são duas palavras. Uma sigla seguida de palavra é a que mais conversores erram: XMLHttpRequest é XML Http Request, não uma palavra e nem oito. A transição de letra para dígito é a que ninguém pensa: user2fa é user 2 fa, e é por isso que user2fa vira user_2_fa em vez de user2fa.

Separadores — espaço, sublinhado, hífen, ponto, barra — são todos tratados igual, e é isso que permite à ferramenta aceitar entrada em qualquer convenção sem que você precise dizer qual. Você não escolhe um formato de origem, porque não há o que escolher.

O I turco

"I".toLocaleLowerCase() é "ı" — um i sem ponto — em turco e azeri, não "i". Isso é correto para esses idiomas e catastrófico para código: toda comparação que ignora maiúsculas e minúsculas contra uma string ASCII falha, e um identificador chamado ID vira algo que o compilador não reconhece. Por isso, a conversão de caixa aqui é independente de localidade por padrão, com caixa sensível à localidade disponível para prosa, onde é a resposta certa.

Estilos de prosa mudam a capitalização, não a estrutura

Sentence case e Title case operam sobre o texto em vez de sobre as palavras dele: pontuação, espaçamento e siglas já existentes sobrevivem. O Title case mantém em minúsculas as palavras menores — a, an, the, of, to e as demais — a menos que sejam a primeira ou a última, que é a regra que a maioria dos guias de estilo em inglês compartilha, mesmo discordando sobre a lista.

Preservar siglas é uma escolha de verdade

user_id para PascalCase é UserId ou UserID, dependendo das convenções da sua linguagem — o guia de estilo do Go exige o segundo; o do C# exige o primeiro para siglas de duas letras e o primeiro para as mais longas. Nenhum está errado, então é uma opção de alternância em vez de uma decisão tomada por você.

Entrada

XMLHttpRequest

Convertido

words        XML | Http | Request
camelCase    xmlHttpRequest
snake_case   xml_http_request
CONSTANT     XML_HTTP_REQUEST
kebab-case   xml-http-request

Quais opções e casos-limite o Converter camelCase e snake_case suporta?

Referência técnica e opções
ParâmetroTipoPadrãoComportamento e casos-limite
camelCasecameluserFirstNameVariáveis e funções de JavaScript e Java. Primeira palavra em minúscula, o resto em maiúscula.
PascalCasepascalUserFirstNameNomes de tipos em quase todas as linguagens: classes, interfaces, componentes React.
snake_casesnakeuser_first_nameIdentificadores em Python e Ruby, e nomes de colunas SQL no Postgres.
CONSTANT_CASEconstantUSER_FIRST_NAMEVariáveis de ambiente e constantes de compilação em C, Java, Go e JavaScript.
kebab-casekebabuser-first-nameURLs, propriedades personalizadas de CSS e nomes de classes, nomes de pacotes npm. Não é um identificador válido na maioria das linguagens.
Train-CasetrainUser-First-NameNomes de cabeçalhos HTTP — Content-Type, X-Request-Id — que são insensíveis a maiúsculas e minúsculas, mas convencionalmente escritos desta forma.
dot.casedotuser.first.nameChaves de configuração aninhadas, chaves de mensagem i18n e namespaces no estilo de pacotes Java.
path/casepathuser/first/nameSegmentos de caminho de URL e caminhos de arquivo construídos a partir de um nome.
Primeira maiúsculasentenceUser first nameProsa. Capitaliza a primeira letra de cada frase e mantém o resto inalterado, para que siglas existentes permaneçam.
Formato De TítulotitleUser First NameTítulos. Palavras menores permanecem em minúsculas, a menos que sejam a primeira ou a última.
minúsculasloweruser first nameA string inteira em minúsculas, pontuação e espaçamento inalterados.
MAIÚSCULASupperUSER FIRST NAMEA string inteira em maiúsculas.
aLtErNaDoalternatinguSeR fIrSt nAmEAlternância de maiúsculas e minúsculas, caractere por caractere.
iNVERSOinverseuSER fIRST nAMEA capitalização de cada letra é invertida.

Perguntas frequentes

Por que XMLHttpRequest foi dividido em três palavras?

Porque são três. A regra é que uma sequência em caixa alta seguida de uma maiúscula e uma minúscula encerra a palavra na fronteira: XMLH-ttp vira XML | Http. Sem ela, você obtém ou uma palavra só — xmlhttprequest — ou oito, com cada maiúscula iniciando uma nova: x_m_l_http_request. Ambos estão errados e ambos são comuns.

Preciso dizer a ele em que formato está minha entrada?

Não, e não existe opção para isso de propósito. Todo separador é tratado igual e toda fronteira de caixa é detectada, então camelCase, snake_case, kebab-case, dot.case e prosa simples são todos divididos na mesma lista de palavras. Entrada mista funciona também, o que importa quando você está convertendo uma lista que alguém montou a partir de três codebases.

Por que existe uma opção de localidade para minúsculas?

Porque "I".toLocaleLowerCase() é "ı" — um i sem ponto — em turco e azeri. Isso é linguisticamente correto e desastroso para identificadores: uma comparação ASCII contra "id" falha, e código que converte a entrada do usuário para minúsculas para compará-la com uma palavra-chave para de funcionar para usuários turcos. A opção fica desligada por padrão porque o trabalho usual aqui é código, e ligada para prosa nesses idiomas.

UserId ou UserID?

Depende da linguagem. O guia de estilo do Go exige UserID e capitaliza todos os inicialismos — APIURL, HTTPServer. C# e Java usam UserId, capitalizando apenas a primeira letra de siglas com mais de dois caracteres. Nenhum é mais correto; use o que combinar com o código ao redor, e é por isso que isso é uma opção de alternância.

Dá para converter um arquivo inteiro de identificadores?

Um por linha, sim — cada linha é convertida de forma independente, então você pode colar uma coluna de um schema ou de uma configuração e receber tudo de volta. Não é um rename ciente de código: ele não sabe quais palavras em uma linha são identificadores e quais são sintaxe, então converte a linha inteira como um nome só.

Meu texto é enviado?

Não. É manipulação de strings, rodando no seu navegador. Os identificadores que as pessoas convertem descrevem sistemas internos — nomes de tabelas, nomes de campos, feature flags — o que não é exatamente segredo, mas também não é algo para entregar a um servidor desconhecido sem motivo.