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 ?

16voto

Anthony S. Points 161

Sur la base de l'un des exemples ci-dessus, j'ai trouvé ceci :

const camelToTitle = (camelCase) => camelCase
  .replace(/([A-Z])/g, (match) => ` ${match}`)
  .replace(/^./, (match) => match.toUpperCase())
  .trim()

Il fonctionne pour moi parce qu'il utilise .trim() pour gérer le cas où la première lettre est en majuscule et que vous vous retrouvez avec un espace supplémentaire.

Référence : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim

10voto

Chris Points 101

Ok, j'ai quelques années de retard sur le jeu, mais j'avais une question similaire, et je voulais faire une solution de remplacement unique pour chaque entrée possible. Je dois donner la plupart du crédit à @ZenMaster dans ce fil de discussion et à @Benjamin Udink ten Cate dans ce fil. Voici le code :

var camelEdges = /([A-Z](?=[A-Z][a-z])|[^A-Z](?=[A-Z])|[a-zA-Z](?=[^a-zA-Z]))/g;
var textArray = ["lowercase",
                 "Class",
                 "MyClass",
                 "HTML",
                 "PDFLoader",
                 "AString",
                 "SimpleXMLParser",
                 "GL11Version",
                 "99Bottles",
                 "May5",
                 "BFG9000"];
var text;
var resultArray = [];
for (var i = 0; i < textArray.length; i++){
    text = textArray[i];
    text = text.replace(camelEdges,'$1 ');
    text = text.charAt(0).toUpperCase() + text.slice(1);
    resultArray.push(text);
}

Il comporte trois clauses, toutes utilisant lookahead pour éviter que le moteur regex ne consomme trop de caractères :

  1. [A-Z](?=[A-Z][a-z]) cherche une lettre majuscule suivie d'une majuscule puis d'une minuscule. C'est pour mettre fin aux acronymes comme USA.
  2. [^A-Z](?=[A-Z]) cherche une lettre non majuscule suivie d'une lettre majuscule. Cela met fin aux mots comme myWord et aux symboles comme 99Bottles.
  3. [a-zA-Z](?=[^a-zA-Z]) recherche une lettre suivie d'une non-lettre. Cela termine les mots avant les symboles comme BFG9000.

Cette question figurait en tête de mes résultats de recherche, j'espère donc pouvoir faire gagner du temps à d'autres !

9voto

asafd Points 183

Voici ma version. Il ajoute un espace avant chaque lettre anglaise majuscule qui vient après une lettre anglaise minuscule et met également la première lettre en majuscule si nécessaire :

Par exemple :
thisIsCamelCase --> C'est le cas de Camel Case
this IsCamelCase --> C'est le cas de Camel Case
thisIsCamelCase123 --> C'est le cas de Camel123

  function camelCaseToTitleCase(camelCase){
    if (camelCase == null || camelCase == "") {
      return camelCase;
    }

    camelCase = camelCase.trim();
    var newText = "";
    for (var i = 0; i < camelCase.length; i++) {
      if (/[A-Z]/.test(camelCase[i])
          && i != 0
          && /[a-z]/.test(camelCase[i-1])) {
        newText += " ";
      }
      if (i == 0 && /[a-z]/.test(camelCase[i]))
      {
        newText += camelCase[i].toUpperCase();
      } else {
        newText += camelCase[i];
      }
    }

    return newText;
  }

7voto

Dipu Points 1120

Cette implémentation prend en compte les lettres majuscules et les chiffres consécutifs.

function camelToTitleCase(str) {
  return str
    .replace(/[0-9]{2,}/g, match => ` ${match} `)
    .replace(/[^A-Z0-9][A-Z]/g, match => `${match[0]} ${match[1]}`)
    .replace(/[A-Z][A-Z][^A-Z0-9]/g, match => `${match[0]} ${match[1]}${match[2]}`)
    .replace(/[ ]{2,}/g, match => ' ')
    .replace(/\s./g, match => match.toUpperCase())
    .replace(/^./, match => match.toUpperCase())
    .trim();
}

// ----------------------------------------------------- //

var testSet = [
    'camelCase',
    'camelTOPCase',
    'aP2PConnection',
    'superSimpleExample',
    'aGoodIPAddress',
    'goodNumber90text',
    'bad132Number90text',
];

testSet.forEach(function(item) {
    console.log(item, '->', camelToTitleCase(item));
});

Sortie attendue :

camelCase -> Camel Case
camelTOPCase -> Camel TOP Case
aP2PConnection -> A P2P Connection
superSimpleExample -> Super Simple Example
aGoodIPAddress -> A Good IP Address
goodNumber90text -> Good Number 90 Text
bad132Number90text -> Bad 132 Number 90 Text

5voto

Alex P Points 344

Si vous traitez avec Affaire Capital Camel cet extrait peut vous aider, il contient également quelques spécifications afin que vous puissiez être sûr qu'il correspond à votre cas.

export const fromCamelCaseToSentence = (word) =>
  word
    .replace(/([A-Z][a-z]+)/g, ' $1')
    .replace(/([A-Z]{2,})/g, ' $1')
    .replace(/\s{2,}/g, ' ')
    .trim();

Et les spécifications :

describe('fromCamelCaseToSentence', () => {
 test('does not fall with a single word', () => {
   expect(fromCamelCaseToSentence('Approved')).toContain('Approved')
   expect(fromCamelCaseToSentence('MDA')).toContain('MDA')
 })

 test('does not fall with an empty string', () => {
   expect(fromCamelCaseToSentence('')).toContain('')
 })

 test('returns the separated by space words', () => {
   expect(fromCamelCaseToSentence('NotApprovedStatus')).toContain('Not Approved Status')
   expect(fromCamelCaseToSentence('GDBState')).toContain('GDB State')
   expect(fromCamelCaseToSentence('StatusDGG')).toContain('Status DGG')
 })
})

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