Comment puis-je convertir une chaîne comme 'helloThere' ou 'HelloThere' en 'Hello There' en JavaScript ?
Réponses
Trop de publicités?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
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 :
-
[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. -
[^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. -
[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 !
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;
}
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
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')
})
})