199 votes

Convertir camelCaseText en texte de casse de phrase

Comment puis-je convertir une chaîne comme 'helloThere' ou 'HelloThere' en 'Hello There' en JavaScript ?

4voto

jfriend00 Points 152127

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/ .

3voto

Barno Points 742

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"

3voto

itachi Points 986

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é :

  1. ([A-Z]) - correspond aux lettres majuscules...
  2. (?=[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 :

  1. ([a-z]) - fait correspondre des lettres minuscules...
  2. (?=[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"]

2voto

Vitaliy Ulantikov Points 2834

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'

2voto

Poorna Rao Points 213

Cela fonctionne pour moi, regardez ça

CamelcaseToWord("MonNom") ; // renvoie Mon Nom

    function CamelcaseToWord(string){
      return string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1");
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X