Par exemple, supposons que j'ai toujours une chaîne délimitée par "-". Y a-t-il un moyen de transformer
c'est-un-grand-jour aujourd'hui
à
c'estJeuAGreatDayAujourd'hui
Vous utilisez RegEx?
Oui (édité pour prendre en charge les entrées non minuscules et Unicode)}:
function camelCase(input) {
return input.toLowerCase().replace(/-(.)/g, function(match, group1) {
return group1.toUpperCase();
});
}
En savoir plus sur "remplacer les rappels" sur les MDN "Spécification d'une fonction en tant que paramètre" documentation.
Le premier argument de la fonction de rappel est la correspondance complète et les arguments suivants sont les groupes entre parenthèses dans l'expression régulière (dans ce cas, le caractère après le trait d'union).
Vous pouvez apparier le caractère Word après chaque tiret (-
) ou le début de la chaîne, ou simplifier en faisant correspondre le caractère Word après chaque limite de Word (\b
):
function camelCase(s) {
return (s||'').toLowerCase().replace(/(\b|-)\w/g, function(m) {
return m.toUpperCase().replace(/-/,'');
});
}
camelCase('foo-bar'); // => 'FooBar'
camelCase('FOo-BaR-gAH'); // => 'FooBarGah'
var test = 'It-is-a-great-day-today';
function camelize(str) {
return str[0].toLowerCase() + str.replace(/-([a-z])/g, function(a, b) {
return b.toUpperCase();
}).slice(1);
}
console.log(camelize(test));
Cela devrait également fonctionner:
function camelCase(str) {
return str.replace(/^.|-./g, function(letter, index) {
return index == 0 ? letter.toLowerCase() : letter.substr(1).toUpperCase();
});
}
Et à mon humble avis, il est un peu plus efficace puisque nous ne convertissons pas d’abord la chaîne d’entrée en minuscule, puis de la convertir en majuscule si nécessaire. Cette fonction ne convertit que la première lettre en minuscule, puis chaque caractère après le tiret -
en majuscule.
Cela fonctionne très bien, mais quelqu'un pourrait peut-être le nettoyer.
var toCamelCase = function(str) {
// Replace special characters with a space
str = str.replace(/[^a-zA-Z0-9 ]/g, " ");
// put a space before an uppercase letter
str = str.replace(/([a-z](?=[A-Z]))/g, '$1 ');
// Lower case first character and some other stuff that I don't understand
str = str.replace(/([^a-zA-Z0-9 ])|^[0-9]+/g, '').trim().toLowerCase();
// uppercase characters preceded by a space or number
str = str.replace(/([ 0-9]+)([a-zA-Z])/g, function(a,b,c) {
return b.trim() + c.toUpperCase();
});
return str;
};
console.log(toCamelCase('hyphen~name~ format'));
console.log(toCamelCase('hyphen.name.format'));
console.log(toCamelCase('hyphen-name-format'));
console.log(toCamelCase('Hyphen-Dame-Gormat'));
console.log(toCamelCase('EquipmentClass name'));
console.log(toCamelCase('Equipment className'));
console.log(toCamelCase('equipment class name'));
console.log(toCamelCase(' e Equipment Class Name'));
console.log(toCamelCase('under9score_name_format'));
console.log(toCamelCase('Enderscore_name_format'));
console.log(toCamelCase('EnderscoreBameFormat'));
console.log(toCamelCase('_EnderscoreBameFormat'));
Je sais que cette question est un peu vieille mais
Voici ma version de la fonction camelCase:
var camelCase = (function () {
var DEFAULT_REGEX = /[-_]+(.)?/g;
function toUpper(match, group1) {
return group1 ? group1.toUpperCase() : '';
}
return function (str, delimiters) {
return str.replace(delimiters ? new RegExp('[' + delimiters + ']+(.)?', 'g') : DEFAULT_REGEX, toUpper);
};
})();
Il gère tous les cas Edge suivants:
Voici un lien pour les tests en direct: http://jsfiddle.net/avKzf/2/
Voici les résultats des tests:
Notez que les chaînes commençant par des délimiteurs génèrent une lettre majuscule au début . Si ce n'est pas ce que vous attendez, vous pouvez toujours utiliser lcfirst .
function lcfirst(str) {
return str && str.charAt(0).toLowerCase() + str.substring(1);
}
Une autre méthode utilisant réduire :
function camelCase(str) {
return str
.split('-')
.reduce((a, b) => a + b.charAt(0).toUpperCase() + b.slice(1));
}
Voir http://jsfiddle.net/54ZcM/
function camelCase(string) {
return string.toLowerCase().replace(/(\-[a-zA-Z])/g, function($1) {
return $1.toUpperCase().replace('-','');
})
}
alert(camelCase('fOo-BarBA-fo'));
var string = "it-is-a-great-day-today";
or
var string = "it_is_a_great_day_today";
var regex = /(_|-)([a-z])/g;
string.toLowerCase().replace(regex, toCamelCase );
function toCamelCase( string ){
return string[1].toUpperCase();
}
Output: "itIsAGreatDayToday";
voici le jsfiddle avec lequel vous pouvez jouer pour tester ceci http://jsfiddle.net/5n84w/2/
`` `
/**
* Function to convert any string to camelCase
* var regex = 'chetan-Ankola###.com---m13ok#-#alo(*finding!R%S#%-GFF';
* Where [-_ .] is the seperator, you can add eg: '@' too
* + is to handle repetition of seperator
* ? is to take care of preceeding token
* match nov(ember)? matches nov and november
*/
var camelCaser = function (str) {
var camelCased = str.replace(/[-_ .]+(.)?/g, function (match, p) {
if (p) {
return p.toUpperCase();
}
return '';
}).replace(/[^\w]/gi, '');
return camelCased;
};
`` `
'it-is-a-great-day-today'.split('-').map(function(x,i){
return (i?x[0].toUpperCase():x[0]) + x.slice(1).toLowerCase()
}).join('')
Résultat:
'itIsAGreatDayToday'
Sinon, .match(/\w+/g)
plutôt que .split('-')
- selon ce que vous voulez faire dans les cas Edge, par exemple "this - is-a-test".