Necesito convertir la cadena dada en mayúsculas y minúsculas, sin importar si la entrada es minúscula o mayúscula
memberships 1 - contactGroupMembership - contactGroupId debe devolver Memberships 1 - Contact Group Membership - Contact Group Id
Memberships1 memberships1-contactGroupMembership-contactGroupId debe devolver Memberships 1 - Contact Group Membership - Contact Group Id
he probado con
str.replace(/([AZ]+)/g, " $1").replace(/([AZ][az])/g, " $1");Puede usar esta solución de 2 pasos para su caso:
input = ['memberships 1 - contactGroupMembership - contactGroupId', 'memberships1-contactGroupMembership-contactGroupId']; const re1 = /\B(?:[AZ]|\d)|\b-\b|(?<=-)[az]/g; const re2 = /\b[az]/g; var repl = []; input.forEach(str => { repl.push(str .replace(re1, ' $&') .replace(re2, m => m.toUpperCase()) ); }); console.log(repl);Explicación:
En el primer .replace insertamos espacio en los lugares deseados usando la primera expresión regular:
\B(?:[AZ]|\d)|\b-\b|(?<=-)[az] Esto coincide con un límite que no es una palabra seguido de una letra mayúscula o un dígito o un - que está rodeado de límites de palabras en ambos lados o una letra minúscula que debe ir precedida de un - . Demostración RegEx 1
Muy específico para este caso de usuario, pero también puede usar una función de reemplazo para escribir en mayúsculas el primer carácter de una palabra o la primera letra mayúscula: str.replace(/(\b[az])|([AZ]+)/g, (m,p1,p2)=> (p1 ? '' : ' ') + (p1 || p2).toUpperCase());
trabajando: se encuentra el principio de la palabra (usado en p1 ) o la primera mayúscula ( p2 ). La función de reemplazo pone en mayúsculas las coincidencias y agrega el espacio adicional solo si no es una coincidencia p1
Manifestación:
let str = 'memberships 1 - contactGroupMembership - contactGroupId'; str = str.replace(/(\b[az])|([AZ]+)/g, (m,p1,p2)=> (p1 ? '' : ' ') + (p1 || p2).toUpperCase()); console.log(str);