Как я могу преобразовать строку в Camel-регистр с помощью JavaScript regex?
EquipmentClass name
или Equipment className
или equipment class name
или Equipment Class Name
должен все стать: equipmentClassName
.
В итоге я сделал вот что:
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 в моей функции. Но такой тип группировки трудно понять, а ваше упоминание о проблемах кросс-браузерности - это то, о чем я тоже никогда не думал.
Глядя на ваш код, вы можете добиться этого всего двумя вызовами 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();
});
}
Базовый подход состоит в том, чтобы разделить строку с помощью регулярного выражения, соответствующего верхнему регистру или пробелам. Затем вы снова склеиваете кусочки. Уловка будет иметь дело с различными способами разбиения регулярных выражений в браузерах. Есть библиотека или что-то, что кто-то написал, чтобы исправить эти проблемы; Я поищу это.
вот ссылка: http://blog.stevenlevithan.com/archives/cross-browser-split
Если 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 могут быть или не быть быстрее.