¿Hay una manera simple de convertir una cadena a mayúscula? Por ejemplo, se john smith
convierte John Smith
. No estoy buscando algo complicado como la solución de John Resig , solo (con suerte) algún tipo de una o dos líneas.
javascript
title-case
MDCore
fuente
fuente
Respuestas:
Prueba esto:
fuente
\w\S*
se usa, en lugar de\w+
o\w*
por ejemplo? No sé por qué querrías incluir algo más que espacios y, por lo tanto, cambiar Jim-Bob a Jim-bob .\w\S*
también causó elJim-bob
problema de nuestra parte. Usando\w*
resuelto esto./([^\W_]+[^\s-]*) */g
resuelve elJim-Bob
problema, es decir:jim-bob
-->
Jim-Bob
jim-bob
-->
Jim-Bob
es tu deseo, probablemente deberías hacerlo/\b\w+/g
. Ejemplo:str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
\w\S*
se usa en lugar de\w+
o\w*
para que las palabras comoDon't
no se modifiquenDon'T
, pero como otros han señalado,\w\S*
causan problemas con las palabras con guiones.Una forma un poco más elegante, adaptando la función de Greg Dean:
Llámalo como:
fuente
Jo-Ann Smith
, este código los convertirá aJo-ann Smith
(tengaa
en cuenta las minúsculasAnn
).Intente aplicar el estilo CSS de transformación de texto a sus controles.
p.ej:
(text-transform: capitalize);
Solo use un enfoque JS cuando sea absolutamente necesario.
fuente
Aquí está mi versión, IMO también es fácil de entender y elegante.
fuente
str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
.toLowerCase()
. Los nombres como "McDonald" o siglas como "ASAP" deben conservar sus caracteres en mayúscula. Si alguien realmente pasó una cadena como "heLLO", la aplicación no debería asumir que las letras mayúsculas son incorrectas.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
es un solo personaje.Aquí está mi función que se convierte en mayúsculas y minúsculas, pero también conserva los acrónimos definidos como mayúsculas y las palabras menores como minúsculas:
Por ejemplo:
fuente
/\w\S*/g
a/([^\W_]+[^\s-]*) */g
por comentario de @ awashburn arriba para abordar esta cuestión./\b\w+/g
, que creo que es más rápido de comprender?/([^\W_]+[^\s-]*) */g
que/\b\w+/g
por el comentario de Michael @; comente si encuentra un caso en el que es necesaria la expresión regular más complicada./\b[\w-\']+/g
para permitir palabras con guiones y apóstrofe en las palabras.Prefiero lo siguiente sobre las otras respuestas. Solo coincide con la primera letra de cada palabra y la capitaliza. Código más simple, más fácil de leer y menos bytes. Conserva las letras mayúsculas existentes para evitar distorsionar los acrónimos. Sin embargo, siempre puede llamar
toLowerCase()
primero a su cadena.Puede agregar esto a su prototipo de cadena que le permitirá lo
'my string'.toTitle()
siguiente:Ejemplo:
Mostrar fragmento de código
fuente
const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());
NoT qUiITe
.toLowerCase
. Solo tenga en cuenta que rompería acrónimos.an HTML document
:An HTML Document
vsAn Html Document
toLowerCase
) es más flexible / útil que una que asume las intenciones de los desarrolladores. Este método también refleja la funcionalidad de métodos integrados similares de otros lenguajes como PHP (ucwords
) y Golang (strings.Title
). .NET (TextInfo.ToTitleCase
) funciona de manera interesante para mayúsculas y minúsculas, pero también dejaría las cadenas totalmente en mayúscula sin cambios.Sin usar regex solo como referencia:
fuente
fuente
'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;})
nuevamente, esto solo funciona para poner en mayúscula la primera letra de una cadena, pero en caso de que sea lo que necesita, mi construcción funciona.'$1'.toUpperCase()
, parece que la mayúscula no se ha hecho cuando se asigna el valor. Se'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })
Podrías inmediatamente
toLowerCase
la cadena, y luego solotoUpperCase
la primera letra de cada palabra. Se convierte en un 1 liner muy simple:fuente
s => s.toUpperCase()
). Mi variante es hacer lo que has hecho, pero extender el objeto String (tan controvertido como es):Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})
=>
, que es una función de flecha nativa (ES6), el enlace salta a los documentos de Mozillla en ellos, que también proporciona una tabla de soporte.En caso de que esté preocupado por esas palabras de relleno, siempre puede decirle a la función qué no capitalizar.
Espero que esto te ayude.
editar
Si desea manejar las palabras adhesivas iniciales, puede realizar un seguimiento de esta con una variable más:
fuente
glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');
and another thing
convierteand Another Thing
. Solo necesito una forma elegante de capitalizar siempre la primera palabra.Si la expresión regular utilizada en las soluciones anteriores te confunde, prueba este código:
fuente
split
lo convierte en una matriz, simplemente no lo ves como obviamente porquemap
significa que no tienes que usar la[]
notaciónHice esta función que puede manejar los apellidos (por lo que no es el caso del título) como "McDonald" o "MacDonald" o "O'Toole" o "D'Orazio". Sin embargo, no maneja nombres alemanes u holandeses con "van" o "von", que a menudo están en minúsculas ... Creo que "de" a menudo también está en minúsculas, como "Robert de Niro". Estos aún tendrían que ser abordados.
fuente
macy
solucionar el problema colocando una mirada negativa hacia adelante para que se\b((m)(a?c))?(\w)
convierta\b((m)(a?c))?(\w)(?!\s)
Parece funcionar ... Probado con lo anterior, "el zorro marrón rápido / saltos / ^ sobre ^ el perro perezoso ..." y "C: / archivos de programa / algún vendedor / su segunda aplicación / a file1.txt ".
Si desea 2º en lugar de 2º, puede cambiar a
/([a-z])(\w*)/g
.La primera forma se puede simplificar como:
fuente
Prueba esto
Ejemplo
fuente
Si puede usar bibliotecas de terceros en su código, lodash tiene una función auxiliar para nosotros.
https://lodash.com/docs/4.17.3#startCase
fuente
Prueba esto de la manera más corta:
fuente
ES 6
más
fuente
s.slice(0, 1).toUpperCase()
si todavía quieres esa primera letra.str
es un solo personaje.charAt(0).toUpperCase()
.La mayoría de estas respuestas parecen ignorar la posibilidad de usar el metacaracter de límite de palabra (\ b). Una versión más corta de la respuesta de Greg Dean utilizándola:
Funciona también para nombres con guiones como Jim-Bob.
fuente
\w
solo incluye los caracteres[A-Za-z0-9_]
, no todas las letras. Para eso necesitarías usar la categoría Unicode\p{L}
. Necesitará el/u
modificador (ver aquí ) y una solución diferente para\b
, que solo funciona entre\W
y\w
(ver aquí )Creo que lo más simple es usar CSS.
fuente
Úselo
/\S+/g
para soportar diacríticos:Sin embargo: " s unshine ( y ellow)" ⇒ " S unshine ( y ellow)"
fuente
Quería agregar mi propia respuesta, ya que necesitaba una
toTitleCase
función robusta que tenga en cuenta las reglas gramaticales enumeradas aquí (artículo recomendado por Google). Hay varias reglas que dependen de la longitud de la cadena de entrada. A continuación se muestran las pruebas de función + unidad.La función también consolida espacios en blanco y elimina caracteres especiales (modifique la expresión regular para sus necesidades)
Función toTitleCase
Pruebas unitarias para garantizar la corrección
Tenga en cuenta que estoy eliminando bastantes caracteres especiales de las cadenas proporcionadas. Tendrá que ajustar la expresión regular para abordar los requisitos de su proyecto.
fuente
fuente
o'henry
, pero hace cosas raras conhorse's mouth
."john f. kennEdy".toLowerCase().replace(/\b\S/g, t => t.toUpperCase())
mejor 🤔\b
y\S
son clases de caracteres especiales que denotan "límite de palabra" y "carácter único, sin espacios en blanco. Por lo tanto, la expresión regular coincide con cada carácter que sigue un límite de palabra y capitaliza ese carácter aplicando la función de flecha dada.Tomando la solución "lewax00", creé esta solución simple que obliga a "w" a partir del espacio o "w" que inicia la palabra, pero no puede eliminar los espacios intermedios adicionales.
El resultado es "Sofía Vergara".
fuente
Aquí está mi función que se ocupa de los caracteres acentuados (¡importante para el francés!) Y que puede activar / desactivar el manejo de excepciones menores. Espero que ayude.
fuente
Hemos tenido una discusión aquí en la oficina y creemos que tratar de corregir automáticamente la forma en que las personas ingresan los nombres en la forma actual que usted quiere que esté hecho está plagado de posibles problemas.
Hemos presentado varios casos en los que los diferentes tipos de capitalización automática se desmoronan y estos son solo para nombres en inglés, cada idioma tiene sus propias complejidades.
Problemas con el uso de mayúsculas en la primera letra de cada nombre:
• Acrónimos como IBM no pueden ser ingresados, se convertirían en Ibm.
• El nombre McDonald se convertiría en Mcdonald, lo cual es incorrecto, lo mismo es MacDonald también.
• Los nombres de doble cañón como Marie-Tonks se convertirían en Marie-tonks.
• Nombres como O'Connor se convertirían en O'connor.
Para la mayoría de estos, podría escribir reglas personalizadas para tratarlo, sin embargo, esto todavía tiene problemas con Acronyms como antes y obtiene un nuevo problema:
• Si se agrega una regla para arreglar nombres con Mac, como MacDonald, los nombres de ruptura como Macy lo convertirían en MacY.
La única solución que hemos encontrado que nunca es incorrecta es poner en mayúscula cada letra, que es un método de fuerza bruta que parece que también usa el DBS.
Entonces, si desea automatizar el proceso, es imposible hacerlo sin un diccionario de cada nombre y palabra y cómo se debe capitular, si no tiene una regla que cubra todo, no lo use ya que solo molestará a sus usuarios y les pedirá a las personas que quieran ingresar sus nombres correctamente que vayan a otro lado.
fuente
Aquí hay otra solución usando CSS (y JavaScript, si el texto que desea transformar está en mayúsculas):
html
js
css
fuente
Para aquellos de nosotros que tenemos miedo de las expresiones regulares (lol):
fuente
Mi solución de una línea:
Luego, puede llamar al método
capitalizeWords()
en cualquier cadena. Por ejemplo:Mi otra solucion:
Luego, puede llamar al método
capitalizeWords()
en cualquier cadena. Por ejemplo:Solución alternativa basada en la respuesta de Greg Dean:
Luego, puede llamar al método
capitalizeWords()
en cualquier cadena. Por ejemplo:fuente
Sorprendido de ver que nadie mencionó el uso del parámetro rest. Aquí hay un revestimiento simple que utiliza los parámetros de descanso de ES6.
fuente
Esto se basa en mi solución para el "Caso de título" de la hoguera de FreeCodeCamp , que requiere que primero convierta la cadena dada a minúsculas y luego convierta cada carácter con un espacio en mayúsculas.
Sin usar regex:
fuente