Estoy generando un nombre significativo con la siguiente regla en un programa JavaScript/Node JS:
Entrada: " tenancy_account__accountPublicId__workspace__workspacePublicId__remove-user__userPublicId "
Salida esperada: "TenancyAccountAccountPublicIdWorkspaceWorkspacePublicIdRemove-userUserPublicId"
Normas:
x | __*x => XEsto es lo que se intenta hasta ahora, buscando mejores alternativas, si las hay:
const convertBetterString = (input) => { const finalString = []; if (input && input.includes('_')) { const inputStringSeparation = input.split('_'); if (inputStringSeparation.length > 1) { if (inputStringSeparation[inputStringSeparation.length - 1] === '') { inputStringSeparation.splice(inputStringSeparation.length - 1, 1); } inputStringSeparation.forEach((val, index) => { if (val === '' && inputStringSeparation[index + 1]) { const actualString = inputStringSeparation[index + 1]; const formattedString = actualString.charAt(0).toUpperCase() + actualString.slice(1); finalString.push(formattedString); } }); return finalString.length > 0 ? finalString.join('') : inputStringSeparation.join(''); } else { return input.charAt(0).toUpperCase() + input.slice(1); } } else { return input; } }Dividir y rebanar
const capitalise = str => str.slice(0,1).toUpperCase() + str.slice(1); // you can add more tests const str = "tenancy_account__accountPublicId__workspace__workspacePublicId__remove-user__userPublicId" const newStr = str.split(/_+/) .map(word => capitalise(word)) .join("") console.log(newStr)Regexp con encadenamiento opcional
const str = "tenancy_account__accountPublicId__workspace__workspacePublicId__remove-user__userPublicId_" const newStr = str.replace(/(?:_+|^)(\w)?/g, (_,letter) => letter?.toUpperCase() ?? "") console.log(newStr)Explicación
(?:_+|^) sin capturar el guión bajo O iniciar
(\w)? seguido de 0 o 1 letra para ser capturado
(_,letter) => letter?.toUpperCase() ?? "") ignora la coincidencia y escribe en mayúscula la letra si la encuentra, eso también ignora los guiones bajos finales
Puedes usar
const str = "tenancy_account__accountPublicId__workspace__workspacePublicId__remove-user__userPublicId__"; const newStr = str .replace(/(?:^|_)_*([^\s_])|_+$/g, (_, x) => x ? x.toUpperCase() : '') console.log(newStr); La expresión regular /(?:^|_)_*([^\s_])|_+$/g coincide con todas las apariciones de
(?:^|_) - inicio de cadena o __* - cero o más guiones bajos([^\s_]) - Grupo 1: cualquier carácter que no sea espacio en blanco y _ .| - o_+$ - uno o más _ s al final de la cadena. El (_, x) => x ? x.toUpperCase() : '' reemplazo elimina todos los guiones bajos (incluso si están al final de la cadena) y cambia el valor del Grupo 1 ( x ) a mayúsculas.