2017-03-04 1 views
0

J'ai des problèmes sous le problème javaScript.JavaScript: Modifier la phrase

Question: Vous avez reçu une chaîne s, qui est censée être une phrase. Cependant, quelqu'un a oublié de mettre des espaces entre les différents mots, et pour une raison quelconque, ils ont capitalisé la première lettre de chaque mot. Renvoyez la phrase après avoir apporté les modifications suivantes:

Placez un seul espace entre les mots. Convertit les majuscules en minuscules.

Exemple

"CodefightsIsAwesome", la sortie devrait être "codefights est génial"; "Bonjour", la sortie devrait être "bonjour".

Mon code actuel est:

enter image description here

En ce moment, mon deuxième pour boucle juste des tranches manuellement les parties de la chaîne. Comment puis-je rendre cette dynamique et insérer "espace" en face de la chaîne Capital?

S'il vous plaît aider

+0

quelle est la valeur de s –

+0

@JijoCleetus La chaîne d'entrée? – guest271314

Répondre

2

Vous pouvez utiliser String.prototype.match() avec RegExp/[A-Z][^A-Z]*/g pour correspondre A-Z suivi d'un ou plusieurs caractères qui ne sont pas A-Z ou caractère à la fin de la chaîne; chaîne Array.prototype.map() pour appeler .toLowerCase() sur les mots appariés, .join() avec le paramètre " " pour inclure le caractère espace entre les correspondances à la chaîne résultante.

var str = "CodefightsIsAwesome"; 
 
var res = str.match(/[A-Z][^A-Z]*/g).map(word => word.toLowerCase()).join(" "); 
 
console.log(res);

Alternativement, comme suggéré par @FissureKing, vous pouvez utiliser String.prototype.repalce() avec .trim() et .toLowerCase() enchaîné

var str = "CodefightsIsAwesome"; 
 
var res = str.replace(/[A-Z][^A-Z]*/g, word => word + ' ').trim().toLowerCase(); 
 
console.log(res);

+1

Peut-être '*' 'au lieu de' + ', pour autoriser les mots d'une lettre? – nnnnnn

+0

@nnnnnn Voir le post mis à jour. Substitué '[^ A-Z]' par '[a-z]' pour faire correspondre les caractères qui ne sont pas des majuscules. – guest271314

+0

Donc si l'entrée était '" ThereIsNobodyCrazierThanI "'? – nnnnnn

-1

Nous pouvons boucle à travers une fois. L'exemple ci-dessous suppose que le premier caractère doit toujours être mis en majuscule dans notre tableau de retour. Si ce n'est pas vrai, supprimez simplement le premier bloc if ci-dessous.

Pour chaque caractère après cela, nous vérifions s'il est en majuscule. Si c'est le cas, nous l'ajoutons à notre tableau de retour, précédé d'un espace. Sinon, nous l'ajoutons tel quel dans notre tableau. Finalement, nous rejoignons le tableau dans une chaîne et nous le renvoyons.

const sentence = "CodefightsIsAwesome"; 
 

 
const amend = function(s) { 
 
    ret = []; 
 
    for (let i = 0; i < s.length; i++) { 
 
    const char = s[i]; 
 
    if (i === 0) { 
 
     ret.push(char.toUpperCase()); 
 
    } else if (char.toUpperCase() === char) { 
 
     ret.push(` ${char.toLowerCase()}`); 
 
    } else { 
 
     ret.push(char); 
 
    } 
 
    } 
 
    return ret.join(''); 
 
}; 
 

 
console.log(amend(sentence));

1

Plutôt que de coder une boucle, je le ferais dans une ligne avec un (raisonnablement) remplacement de chaîne simple:

function amendTheSentence(s) { 
 
    return s.replace(/[A-Z]/g, function(m) { return " " + m.toLowerCase() }) 
 
      .replace(/^ /, ""); 
 
} 
 

 
console.log(amendTheSentence("CodefightsIsAwesome")); 
 
console.log(amendTheSentence("noCapitalOnFirstWord")); 
 
console.log(amendTheSentence("ThereIsNobodyCrazierThanI"));

Ce est, correspondre à une lettre majuscule avec l'expression régulière /[A-Z]/, remplacer La lettre correspondante avec un espace plus cette lettre en minuscule, puis supprimez tout espace ajouté au début de la chaîne.

Pour en savoir plus: