Преобразование любой строки в Camel-регистр

Как я могу преобразовать строку в Camel-регистр с помощью JavaScript regex?

EquipmentClass name или Equipment className или equipment class name или Equipment Class Name

должен все стать: equipmentClassName.

145
задан рüффп 19 December 2017 в 21:40
поделиться

4 ответа

В итоге я сделал вот что:

String.prototype.toCamelCase = function(str) {
    return str
        .replace(/\s(.)/g, function($1) { return $1.toUpperCase(); })
        .replace(/\s/g, '')
        .replace(/^(.)/, function($1) { return $1.toLowerCase(); });
}

Я пытался избежать цепочки из нескольких операторов replace. Что-то, где у меня были бы $1, $2, $3 в моей функции. Но такой тип группировки трудно понять, а ваше упоминание о проблемах кросс-браузерности - это то, о чем я тоже никогда не думал.

47
ответ дан 23 November 2019 в 22:45
поделиться

Глядя на ваш код, вы можете добиться этого всего двумя вызовами replace:

function camelize(str) {
  return str.replace(/(?:^\w|[A-Z]|\b\w)/g, function(word, index) {
    return index == 0 ? word.toLowerCase() : word.toUpperCase();
  }).replace(/\s+/g, '');
}

camelize("EquipmentClass name");
camelize("Equipment className");
camelize("equipment class name");
camelize("Equipment Class Name");
// all output "equipmentClassName"

Edit: Или одним вызовом replace, захватывая белые пробелы также в RegExp.

function camelize(str) {
  return str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function(match, index) {
    if (+match === 0) return ""; // or if (/\s+/.test(match)) for white spaces
    return index == 0 ? match.toLowerCase() : match.toUpperCase();
  });
}
208
ответ дан 23 November 2019 в 22:45
поделиться

Базовый подход состоит в том, чтобы разделить строку с помощью регулярного выражения, соответствующего верхнему регистру или пробелам. Затем вы снова склеиваете кусочки. Уловка будет иметь дело с различными способами разбиения регулярных выражений в браузерах. Есть библиотека или что-то, что кто-то написал, чтобы исправить эти проблемы; Я поищу это.

вот ссылка: http://blog.stevenlevithan.com/archives/cross-browser-split

0
ответ дан 23 November 2019 в 22:45
поделиться

Если regexp не требуется, вы можете посмотреть на следующий код, который я сделал давным-давно для Twinkle:

String.prototype.toUpperCaseFirstChar = function() {
    return this.substr( 0, 1 ).toUpperCase() + this.substr( 1 );
}

String.prototype.toLowerCaseFirstChar = function() {
    return this.substr( 0, 1 ).toLowerCase() + this.substr( 1 );
}

String.prototype.toUpperCaseEachWord = function( delim ) {
    delim = delim ? delim : ' ';
    return this.split( delim ).map( function(v) { return v.toUpperCaseFirstChar() } ).join( delim );
}

String.prototype.toLowerCaseEachWord = function( delim ) {
    delim = delim ? delim : ' ';
    return this.split( delim ).map( function(v) { return v.toLowerCaseFirstChar() } ).join( delim );
}

Я не делал никаких тестов производительности, и версии regexp могут быть или не быть быстрее.

9
ответ дан 23 November 2019 в 22:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: