Dada una cadena como esta "HowToMakeALiving", quiero dividirla y convertirla en "Cómo ganarse la vida". Otra situación es "howToMakeALiving", por lo que la primera palabra "how" no comienza con mayúscula mientras que otras palabras comienzan con mayúscula y todavía quiero dividirla y generar "Cómo ganarse la vida".
Hay algunas preguntas en la comunidad, pero rara vez están relacionadas con JS o necesitan usar paquetes, y su situación es más complicada, la cadena dada está en minúsculas.
Entonces, la pregunta es ¿cómo puedo hacer eso mediante expresiones regulares en Javascript o cualquier otro método mejor?
Podrías usar una expresión regular:
function splitWords(s) { return s.match(/.[^AZ]*/g).map((word, i) => (i ? word[0].toLowerCase() : word[0].toUpperCase()) + word.slice(1) ).join(" "); } let words = splitWords("howToMakeALiving"); console.log(words); words = splitWords("WhyIHadMyDNATakenInParis"); console.log(words); La expresión regular busca cualquier carácter ( . ) seguido de una serie de caracteres que no sean mayúsculas. Cada hallazgo es una palabra.
El bucle distingue entre la primera palabra ( i == 0 ) y otras palabras ( i es veraz). El primer carácter de cada palabra se convierte en mayúsculas (primera palabra) o en minúsculas (todas las demás palabras).
Finalmente, las palabras se unen en una frase uniéndolas con un espacio como separador.
Si es necesario capturar abreviaturas como "DNA" y el pronombre personal "I", podría:
function splitWords(s) { return s.match(/.([^AZ]+|.*?(?=[AZ]([^AZ]|$)|$))/g).map((word, i) => (i && word !== "I" && (word.length < 2 || word[1] != word[1].toUpperCase()) ? word[0].toLowerCase() : word[0].toUpperCase() ) + word.slice(1) ).join(" "); } let words = splitWords("howToMakeALiving"); console.log(words); words = splitWords("WhyIHadMyDNATakenInParis"); console.log(words); words = splitWords("iHateHavingADNATestTaken"); console.log(words);Opción 1: Haría esto con el método de compilación .match() como este:
let textvalue = 'howToMakeALiving' let splitdata = textvalue.match(/[AZ][az]+|[0-9]+/g).join(" ") console.log(splitdata) Opción 2: puede usar el método string.split() que también admite expresiones regulares, se puede lograr así
let textvalue = 'howToMakeALiving' let splitdata = textvalue.split(/(?=[AZ])/); console.log(splitdata)Intente esto, puede tener un error o dos, pero lo enviará por el camino correcto.
var res = ''; var chars = 'HowToMakeALiving'.split(); var lastChar = ''; for (var i = 0; i < chars.length; i++) { if (lastChar = '') lastChar = chars[i]; if (chars[i].toUpperCase() != chars[i] && lastChar.toUpperCase() != lastChar) res = res + ' '; res = res + chars[i]; } console.log(res)