Например, предположим, что у меня всегда есть строка, которая ограничена символом "-". Есть ли способ преобразовать
он-это-пра-повседневное
к
itIsAGreatDayToday
Использование RegEx?
Например, предположим, что у меня всегда есть строка, которая ограничена символом "-". Есть ли способ преобразовать
он-это-пра-повседневное
к
itIsAGreatDayToday
Использование RegEx?
Да ( отредактировано для поддержки ввода в нижнем регистре и Unicode):
function camelCase(input) {
return input.toLowerCase().replace(/-(.)/g, function(match, group1) {
return group1.toUpperCase();
});
}
Подробнее о "замене обратных вызовов" на MDN "Указание функции как параметра" .
Первым аргументом функции обратного вызова является полное совпадение, а последующие аргументы - это скобки в регулярном выражении (в этом случае символ после дефиса).
Вы можете сопоставлять символ слова после каждой тире (-
) или начала строки, или вы можете упростить, сопоставляя символ слова после каждой границы слова (\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));
Это также должно работать:
function camelCase(str) {
return str.replace(/^.|-./g, function(letter, index) {
return index == 0 ? letter.toLowerCase() : letter.substr(1).toUpperCase();
});
}
И IMHO это немного более эффективно, так как мы не конвертируем всю строку ввода в нижний регистр, а затем конвертируем в верхний регистр, если это необходимо. Эта функция преобразует только первую букву в нижний регистр, а затем каждый символ после дефиса -
в верхний регистр.
См. 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'));
Я знаю, что этот вопрос немного стар, но
Здесь моя версия функции 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);
};
})();
Он обрабатывает все следующие случаи ребер:
Здесь ссылка на живые тесты: http://jsfiddle.net/avKzf/2/
Вот результаты тестов:
Обратите внимание, что строки, начинающиеся с разделителей, приведут к заглавной букве в начале. Если это не то, что вы ожидаете, вы всегда можете использовать lcfirst. Здесь мой lcfirst, если вам это нужно:
function lcfirst(str) {
return str && str.charAt(0).toLowerCase() + str.substring(1);
}
Это отлично работает, но кто-то может его очистить.
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'));
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";
вот jsfiddle, с которым вы можете играть, чтобы проверить это 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('')
Результат:
'itIsAGreatDayToday'
В качестве альтернативы .match(/\w+/g)
, а не .split('-')
- в зависимости от того, что вы хотите делать в таких случаях, как "this-is-a-test".
Другой метод, использующий reduce:
function camelCase(str) {
return str
.split('-')
.reduce((a, b) => a + b.charAt(0).toUpperCase() + b.slice(1));
}
$scope.toCamelCase = function(arg){
var arg = arg.toLowerCase();
var arr = arg.split("");
arr[0] = arr[0].toUpperCase();
return arr.join("");
};