Actualmente quiero poner en mayúscula la primera letra del nombre de una ciudad; pero dado que en mi país tenemos muchas ciudades con un nombre compuesto de varias palabras (por ejemplo, Nueva York), actualmente estoy usando esta expresión regular:
/\w\S*/g
así que estoy usando esta función
function capitalizeWords(myString) { return myString.replace(/\w\S*/g, w => w.replace(/^\w/, c => c.toUpperCase())) } para que pueda cambiar de new york en New York .
Pero ahora tengo un pequeño problema, tengo algunas ciudades como
sauze d'oulx
y necesito convertirlo a Sauze d'Oulx , excluyendo la d , o en cualquier caso el primer carácter antes del símbolo ' .
¿Cuál es el truco para excluir un carácter antes de uno conocido?
Puede definir todas sus excepciones como alternativas antes de hacer coincidir y capturar su coincidencia esperada:
const texts = ["new york", "sauze d'oulx"]; const capitalizeWords = (myString) => myString.replace(/\bd['']|(\w)(\S*)/g, (m, g, h) => g ? g.toUpperCase() + h : m); for (const text of texts) { console.log(text, '->', capitalizeWords(text)); } La expresión regular \bd['']|(\w)(\S*) coincide
\bd[''] - una d' o d' después de un carácter que no es una palabra o al comienzo de una cadena| - o(\w)(\S*) - una palabra char capturada en el Grupo 1 ( g en el código anterior) y luego cero o más espacios que no sean espacios en blanco en el Grupo 2 ( h en el código anterior). El (m, g, h) => g ? g.toUpperCase() + h : m reemplazo significa que el reemplazo es la coincidencia en sí misma si el Grupo 1 no coincidió, de lo contrario, el carácter coincidente con \w se escribe en mayúscula.
Ampliando con la preposición di :
const texts = ["new york", "sauze d'oulx", "bagno di romagna"]; const capitalizeWords = (myString) => myString.replace(/\bd(?:['']|i\b)|(\w)(\S*)/g, (m, g, h) => g ? g.toUpperCase() + h : m); for (const text of texts) { console.log(text, '->', capitalizeWords(text)); }