Existe uma maneira simples de converter uma string em maiúsculas e minúsculas? Por exemplo, john smith
torna-se John Smith
. Não estou procurando algo complicado como a solução de John Resig , apenas (espero) algum tipo de uma ou duas linhas.
javascript
title-case
MDCore
fonte
fonte
Respostas:
Tente o seguinte:
fonte
\w\S*
é usado, em vez de\w+
ou\w*
por exemplo? Não sei por que você gostaria de incluir algo além de espaços e, portanto, mudar Jim-Bob para Jim-bob .\w\S*
também causou oJim-bob
problema do nosso lado. Usando\w*
resolveu isso./([^\W_]+[^\s-]*) */g
resolve oJim-Bob
problema, ou seja:jim-bob
-->
Jim-Bob
jim-bob
-->
Jim-Bob
é o seu desejo, você provavelmente deve fazer/\b\w+/g
. Exemplo:str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
\w\S*
é usado em vez de\w+
ou\w*
para que palavras comoDon't
não sejam modificadasDon'T
, mas, como outros já apontaram,\w\S*
causa problemas com as palavras hifenizadas.Uma maneira um pouco mais elegante, adaptando a função de Greg Dean:
Chame assim:
fonte
Jo-Ann Smith
, esse código os converterá emJo-ann Smith
(observe a letra minúsculaa
emAnn
).Tente aplicar o estilo CSS de transformação de texto aos seus controles.
por exemplo:
(text-transform: capitalize);
Use apenas uma abordagem JS quando for absolutamente necessário.
fonte
Aqui está minha versão, IMO também é fácil de entender e elegante.
fonte
str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
.toLowerCase()
. Nomes como "McDonald" ou acrônimos como "O MAIS CEDO POSSÍVEL" devem manter seus caracteres maiúsculos. Se alguém realmente passou uma string como "heLLO", o aplicativo não deve assumir que as letras maiúsculas estão incorretas.String.prototype.toTitleCase = function (blnForceLower) { var strReturn; (blnForceLower ? strReturn = this.toLowerCase() : strReturn = this); return strReturn .split(' ') .map(i => i[0].toUpperCase() + i.substr(1)) .join(' '); }
str
houver um único caractere.Aqui está minha função que converte para maiúsculas, mas também preserva acrônimos definidos como maiúsculas e palavras menores como minúsculas:
Por exemplo:
fonte
/\w\S*/g
para/([^\W_]+[^\s-]*) */g
o comentário de @ @ awashburn acima para resolver isso./\b\w+/g
, que considero mais rapidamente compreensível?/([^\W_]+[^\s-]*) */g
para/\b\w+/g
por @ comentário de Michael; comente se você encontrar um caso em que a regex mais complicada seja necessária./\b[\w-\']+/g
para permitir palavras hifenizadas e apóstrofo em palavras.Eu prefiro o seguinte sobre as outras respostas. Corresponde apenas à primeira letra de cada palavra e a coloca em maiúscula. Código mais simples, mais fácil de ler e menos bytes. Ele preserva as letras maiúsculas existentes para evitar acrônimos distorcidos. No entanto, você sempre pode chamar
toLowerCase()
sua string primeiro.Você pode adicionar isso ao seu protótipo de string, o que permitirá o
'my string'.toTitle()
seguinte:Exemplo:
Mostrar snippet de código
fonte
const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());
NoT qUiITe
.toLowerCase
. Esteja ciente de que isso quebraria siglas.an HTML document
:An HTML Document
vsAn Html Document
toLowerCase
) é mais flexível / útil do que aquela que assume as intenções dos desenvolvedores. Esse método também reflete a funcionalidade de métodosucwords
internos semelhantes de outras linguagens, como PHP ( ) e Golang (strings.Title
). O .NET (TextInfo.ToTitleCase
) funciona de maneira interessante para maiúsculas e minúsculas, mas também deixaria inalteradas as strings totalmente capitalizadas.Sem usar regex apenas para referência:
fonte
fonte
'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;})
Novamente, isso só funciona para colocar em maiúscula a primeira letra de uma string, mas, caso seja disso que você precisa, minhas obras de construção.'$1'.toUpperCase()
, parece que as letras maiúsculas não foram concluídas no momento em que o valor é atribuído.'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })
Você poderia imediatamente
toLowerCase
a string e, em seguida, apenastoUpperCase
a primeira letra de cada palavra. Torna-se um liner 1 muito simples:fonte
s => s.toUpperCase()
). Meu variante é fazer o que você fez, mas estendendo o objeto String (tão controverso como que é):Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})
=>
, que é uma função de seta nativa (ES6), o link pula para o Mozillla Docs neles, que também fornece uma tabela de suporte.No caso de você estar preocupado com essas palavras de preenchimento, você sempre pode dizer à função o que não deve capitalizar.
Espero que isso ajude você.
editar
Se você deseja manipular as principais palavras de cola, acompanhe essa variável com mais uma:
fonte
glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');
and another thing
se tornaand Another Thing
. Só precisa de uma maneira elegante de sempre capitalizar a primeira palavra.Se o regex usado nas soluções acima estiver deixando você confuso, tente este código:
fonte
split
não convertê-lo para um array, você simplesmente não vê-lo como, obviamente, porquemap
significa que você não tem que usar[]
a notaçãoEu criei essa função que pode lidar com sobrenomes (por isso não é maiúscula), como "McDonald" ou "MacDonald" ou "O'Toole" ou "D'Orazio". No entanto, ele não lida com nomes alemães ou holandeses com "van" ou "von", que geralmente estão em minúsculas ... Eu acredito que "de" também é minúsculo, como "Robert de Niro". Estes ainda teriam que ser abordados.
fonte
macy
problema, colocando um lookahead negativo em lá assim que\b((m)(a?c))?(\w)
se torna\b((m)(a?c))?(\w)(?!\s)
Parece funcionar ... Testado com o exposto acima, "a raposa marrom-rápida? / Pula / ^ sobre ^ o cão preguiçoso!" E "C: / arquivos de programas / algum fornecedor / sua segunda aplicação / a file1.txt ".
Se você deseja 2º em vez de 2º, pode mudar para
/([a-z])(\w*)/g
.A primeira forma pode ser simplificada como:
fonte
Tente isto
Exemplo
fonte
Se você pode usar bibliotecas de terceiros em seu código, o lodash possui uma função auxiliar para nós.
https://lodash.com/docs/4.17.3#startCase
fonte
Tente da maneira mais curta:
fonte
ES 6
outro
fonte
s.slice(0, 1).toUpperCase()
se você ainda quiser a primeira letra.str
é um único caractere.charAt(0).toUpperCase()
.A maioria dessas respostas parece ignorar a possibilidade de usar a palavra metacaractere de limite (\ b). Uma versão mais curta da resposta de Greg Dean, utilizando-a:
Também funciona para nomes hifenizados como Jim-Bob.
fonte
\w
inclui apenas os caracteres[A-Za-z0-9_]
, nem todas as letras. Para isso, você precisará usar a categoria Unicode\p{L}
. Você precisa ter o/u
modificador (veja aqui ) e uma solução diferente para\b
, que só funciona entre\W
e\w
(ver aqui )Eu acho que o mais simples é usar css.
fonte
Use
/\S+/g
para suportar diacríticos:No entanto: " s unshine ( y ellow)" ⇒ " S unshine ( y ellow)"
fonte
Queria adicionar minha própria resposta, pois precisava de uma
toTitleCase
função robusta que levasse em conta as regras gramaticais listadas aqui (artigo recomendado pelo Google). Existem várias regras que dependem do comprimento da sequência de entrada. Abaixo está a função + testes de unidade.A função também consolida o espaço em branco e remove caracteres especiais (modifique a expressão regular para suas necessidades)
Função toTitleCase
Testes de unidade para garantir a correção
Observe que estou removendo um pouco de caracteres especiais das strings fornecidas. Você precisará ajustar a regex para atender aos requisitos do seu projeto.
fonte
fonte
o'henry
, mas faz coisas estranhashorse's mouth
."john f. kennEdy".toLowerCase().replace(/\b\S/g, t => t.toUpperCase())
better 🤔\b
e denotam "limite de palavras" e "caractere único, sem espaço em branco. Portanto, a expressão regular corresponde a cada caractere após um limite de palavra e coloca em maiúscula esse caractere aplicando a função de seta fornecida.\S
Tomando a solução "lewax00", criei esta solução simples que força "w" começando com espaço ou "w" que inicia o word, mas não é capaz de remover os espaços intermediários extras.
O resultado é "Sofía Vergara".
fonte
Aqui está minha função que cuida de caracteres acentuados (importantes para o francês!) E que pode ativar / desativar o tratamento de exceções menores. Espero que ajude.
fonte
Temos discutido aqui no escritório e achamos que tentar corrigir automaticamente a maneira como as pessoas inserem nomes da maneira atual que você quer que seja está repleto de possíveis problemas.
Chegamos a vários casos em que diferentes tipos de capitalização automática se desintegram e estes são apenas para nomes em inglês, cada idioma tem suas próprias complexidades.
Problemas ao colocar em maiúscula a primeira letra de cada nome:
• Acrônimos como IBM não podem ser inseridos, se tornariam Ibm.
• O nome McDonald se transformaria em Mcdonald, o que está incorreto, a mesma coisa também é MacDonald.
• Nomes de cano duplo, como Marie-Tonks, seriam transformados em Marie-Tonks.
• Nomes como O'Connor se tornariam O'connor.
Para a maioria deles, você pode escrever regras personalizadas para lidar com isso, no entanto, isso ainda tem problemas com acrônimos como antes e você recebe um novo problema:
• A adição de uma regra para corrigir nomes no Mac, como MacDonald, quebraria nomes como Macy, transformando-o em MacY.
A única solução que encontramos que nunca é incorreta é colocar em maiúscula todas as letras que são um método de força bruta que o DBS parece também usar.
Portanto, se você deseja automatizar o processo, é tão impossível quanto fazer sem um dicionário de cada nome e palavra e como deve ser capitulado. Se você não tem uma regra que cubra tudo, não o use como apenas irritará seus usuários e solicitará que as pessoas que desejam inserir seus nomes corretamente possam ir para outro lugar.
fonte
aqui está outra solução usando css (e javascript, se o texto que você deseja transformar estiver em maiúsculas):
html
js
css
fonte
Para aqueles de nós que têm medo de expressões regulares (risos):
fonte
Minha solução de uma linha:
Em seguida, você pode chamar o método
capitalizeWords()
em qualquer sequência. Por exemplo:Minha outra solução:
Em seguida, você pode chamar o método
capitalizeWords()
em qualquer sequência. Por exemplo:Solução alternativa baseada na resposta de Greg Dean:
Em seguida, você pode chamar o método
capitalizeWords()
em qualquer sequência. Por exemplo:fonte
Surpreso ao ver que ninguém mencionou o uso do parâmetro rest. Aqui está um liner simples que usa os parâmetros Rest ES6.
fonte
Isso se baseia na minha solução para o Bonfire "Title Case" do FreeCodeCamp , que exige que você primeiro converta a sequência especificada para todas as letras minúsculas e, em seguida, converta todos os caracteres que procedem de um espaço para letras maiúsculas.
Sem usar regex:
fonte