Comment puis-je convertir une chaîne comme 'helloThere' ou 'HelloThere' en 'Hello There' en JavaScript ?
Réponses
Trop de publicités?Vous pouvez utiliser une fonction comme celle-ci :
function fixStr(str) {
var out = str.replace(/^\s*/, ""); // strip leading spaces
out = out.replace(/^[a-z]|[^\s][A-Z]/g, function(str, offset) {
if (offset == 0) {
return(str.toUpperCase());
} else {
return(str.substr(0,1) + " " + str.substr(1).toUpperCase());
}
});
return(out);
}
"hello World" ==> "Hello World"
"HelloWorld" ==> "Hello World"
"FunInTheSun" ==? "Fun In The Sun"
Code avec un tas de chaînes de test ici : http://jsfiddle.net/jfriend00/FWLuV/ .
Version alternative qui conserve les espaces de tête ici : http://jsfiddle.net/jfriend00/Uy2ac/ .
Essayez cette bibliothèque
http://sugarjs.com/api/String/titleize
'man from the boondocks'.titleize()>"Man from the Boondocks"
'x-men: the last stand'.titleize()>"X Men: The Last Stand"
'TheManWithoutAPast'.titleize()>"The Man Without a Past"
'raiders_of_the_lost_ark'.titleize()>"Raiders of the Lost Ark"
Une autre solution basée sur RegEx.
respace(str) {
const regex = /([A-Z])(?=[A-Z][a-z])|([a-z])(?=[A-Z])/g;
return str.replace(regex, '$& ');
}
Explication
Le RegEx ci-dessus est composé de deux parties similaires séparées par des points de suspension. OU opérateur. La première moitié :
-
([A-Z])
- correspond aux lettres majuscules... -
(?=[A-Z][a-z])
- suivi d'une séquence de lettres majuscules et minuscules.
Lorsqu'il est appliqué à la séquence FOo ce qui correspond effectivement à son F lettre.
Ou le deuxième scénario :
-
([a-z])
- fait correspondre des lettres minuscules... -
(?=[A-Z])
- suivi d'une lettre majuscule.
Lorsqu'il est appliqué à la séquence barFoo ce qui correspond effectivement à son r lettre.
Lorsque tous les candidats au remplacement ont été trouvés, la dernière chose à faire est de les remplacer par la même lettre mais avec un caractère espace supplémentaire. Pour cela, nous pouvons utiliser '$& '
comme remplacement, et il se résoudra en une sous-chaîne correspondante suivie d'un caractère espace.
Exemple
const regex = /([A-Z])(?=[A-Z][a-z])|([a-z])(?=[A-Z])/g
const testWords = ['ACoolExample', 'fooBar', 'INAndOUT', 'QWERTY', 'fooBBar']
testWords.map(w => w.replace(regex, '$& '))
->(5) ["A Cool Example", "foo Bar", "IN And OUT", "QWERTY", "foo B Bar"]
Aucune des réponses ci-dessus n'a fonctionné parfaitement pour moi, j'ai donc dû trouver mon propre vélo :
function camelCaseToTitle(camelCase) {
if (!camelCase) {
return '';
}
var pascalCase = camelCase.charAt(0).toUpperCase() + camelCase.substr(1);
return pascalCase
.replace(/([a-z])([A-Z])/g, '$1 $2')
.replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
.replace(/([a-z])([0-9])/gi, '$1 $2')
.replace(/([0-9])([a-z])/gi, '$1 $2');
}
Cas de test :
null => ''
'' => ''
'simpleString' => 'Simple String'
'stringWithABBREVIATIONInside => 'String With ABBREVIATION Inside'
'stringWithNumber123' => 'String With Number 123'
'complexExampleWith123ABBR890Etc' => 'Complex Example With 123 ABBR 890 Etc'