Estoy tratando de poner en mayúscula la primera letra de cada palabra en una cadena. Encontré preguntas similares en línea, pero ninguna parece responder a mi pregunta de ignorar las contracciones como can't, won't, wasnt.
Este fragmento de código funciona pero también escribe en mayúscula la letra después del apóstrofe en la contracción.
var str = str.replace(/\b\w/g, w => w.toUpperCase())Si la cadena contiene una contracción como can't o won't, generará Can'T o Won'T.
¿Hay alguna forma de ignorar los apóstrofes que están en medio de una palabra? Todavía quiero poner en mayúsculas las palabras que están separadas por otros signos de puntuación. Por ejemplo:
Puedes usar
const texts = ["this_can't_be_an_example", 'this/is/an/example', 'this,is,an,example'] for (const text of texts) { console.log(text, '=>', text.replace(/([\W_]|^)(\w)(?<!\w'\w)/g, (_, x,y) => `${x}${y.toUpperCase()}` )) }Vea la demostración de expresiones regulares . Detalles :
([\W_]|^) - Grupo 1 ( x ): un carácter no alfanumérico o inicio de cadena(\w) - Grupo 2 ( y ): una palabra char(?<!\w'\w) - una mirada negativa hacia atrás que asegura que el valor del Grupo 2 no esté precedido por una palabra char y un ' .Puede usar una mirada hacia atrás negativa para asegurarse de que no haya una apostrofia antes del límite de la palabra. (?:\b|(?<=_)) busca un límite de palabra o un guión bajo antes de la palabra.
const examples = [ "can't", "this-is-an-example", "this.is.an.example", "this/is/an/example", "this_is_an_example", "this,is,an,example", ]; examples.forEach(example => { console.log(example.replace(/(?<!')(?:\b|(?<=_))\w/g, w => w.toUpperCase())); });Esta RegExp detecta
/ símbolo Simplemente agregue símbolos de necesidad en la lista con | separador
str.replace(/((^|_| |\/|,|')\w)/g, w => w.toUpperCase());