JavaScript RegExp для CamelCase - дефисное свойство CSS

Я пытаюсь изменить свойства CSS, подобные этому.

-moz-border-radius

В CSS-свойство JavaScript, например:

MozBorderRadius

Я использую этот RegExp.

var exp = new RegExp('-([a-z])', 'gi');
console.log('-moz-border-radius'.replace(exp, '$1'));

Все, что мне нужно сделать, - это конвертировать $1 в верхний регистр, чтобы он мог работать в cammelcaseify (да, я сделал это слово...) свой CSS-свойство на основе JavaScript. Возможно ли это?

Спасибо.

Ответ 1

Вам лучше было бы использовать функцию в качестве второго параметра в replace(), и вы могли бы также использовать литерал регулярного выражения вместо конструктора RegExp:

var replaced = '-moz-border-radius'.replace(/-([a-z])/gi, function(s, group1) {
    return group1.toUpperCase();
});

Ответ 2

Вам нужно передать функцию обратного вызова вместо строки.

Например:

var exp = /-([a-z])/gi;
console.log('-moz-border-radius'.replace(exp, 
    function(match, char, index, str) {
        return char.toUpperCase();
    }
));

Ответ 3

Другой, немного более гибкий ответ:

if (typeof String.prototype.toCamel !== 'function') {
  String.prototype.toCamel = function(){
    return this.replace(/[-_]([a-z])/g, function (g) { return g[1].toUpperCase(); })
  };
}

Используется следующим образом:

'-moz-border-radius'.toCamel(); // "MozBorderRadius"
'moz-border-radius'.toCamel(); // "mozBorderRadius"
'moz_border_radius'.toCamel(); // "mozBorderRadius"
'_moz_border_radius'.toCamel(); // "MozBorderRadius"

Ответ 4

Дополнительная информация...

MozBorderRadius = PascalCase A.K.A UpperCamelCase.

mozBorderRadius = camelCase.

moz_border_radius = snake_case.

var string = "hyphen-delimited-to-camel-case"
or
var string = "snake_case_to_camel_case"


function toCamelCase( string ){
  return string.toLowerCase().replace(/(_|-)([a-z])/g, toUpperCase );
}

function toUpperCase( string ){
  return string[1].toUpperCase();
}

Output: hyphenDelimitedToCamelCase

Ответ 5

также можно использовать indexOf с рекурсией для этой задачи.

input some-foo_sd_dsd-weqe
output someFooSdDsdWeqe

но работает медленнее

MozBorderRadius
test1: 3.535ms

код:

function camelCased (str) {

        function check(symb){

            let idxOf = str.indexOf(symb);
            if (idxOf === -1) {
                return str;
            }

            let letter = str[idxOf+1].toUpperCase();
            str = str.replace(str.substring(idxOf+1,idxOf+2), '');
            str = str.split(symb).join(idxOf !== -1 ? letter : '');

            return camelCased(str);
        }       

        return check('_') && check('-');

    }

console.log(camelCased ('-moz-border-radius'));