Преобразование любой строки в верблюжий футляр

Как я могу преобразовать строку в регистр верблюда с помощью регулярного выражения javascript?

EquipmentClass name or Equipment className or equipment class name or Equipment Class Name

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


person Scott Klarenbach    schedule 03.06.2010    source источник
comment
Я провел тестирование различных методов jsperf. результаты были немного неубедительными. похоже, это зависит от входной строки.   -  person yincrash    schedule 27.09.2011
comment
Новый тест jsperf с несколькими различными строками для тестирования и более широким набором реализаций: jsperf.com/camel-casing-regexp-or-character-manipulation/1 - это приводит меня к выводу, что в среднем случае, несмотря на формулировку этого вопроса, регулярные выражения не то, что вы хотите. Их не только сложнее понять, но и (по крайней мере, для текущих версий Chrome) они запускаются примерно в два раза дольше.   -  person Jules    schedule 20.10.2017


Ответы (32)


Глядя на ваш код, вы можете добиться этого с помощью всего двух 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"

Изменить: или с помощью одного 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();
  });
}
person Christian C. Salvadó    schedule 04.06.2010
comment
Отличный код, и в итоге он выиграл jsperf.com/js-camelcase/5. Хотите добавить версию, которая может обрабатывать (удалять) символы, отличные от альфа? camelize("Let's Do It!") === "let'SDoIt!" грустное лицо. Я попробую сам, но боюсь, что просто добавлю еще одну замену. - person Orwellophile; 19.05.2015
comment
.. поскольку не-альфа не должно влиять на дело, я не уверен, что это можно сделать лучше, чем _1 _... - person Orwellophile; 19.05.2015
comment
Можете ли вы рассказать о преимуществах /(?:^\w|[A-Z]|\b\w)/ перед /\b\w/? На мой взгляд, они выглядят одинаково (хотя второй немного попроще). - person Motti; 10.01.2016
comment
Для моих друзей из ES2015 +: один лайнер, основанный на приведенном выше коде. const toCamelCase = (str) => str.replace(/(?:^\w|[A-Z]|\b\w)/g, (ltr, idx) => idx === 0 ? ltr.toLowerCase() : ltr.toUpperCase()).replace(/\s+/g, ''); - person tabrindle; 18.01.2017
comment
Хотя это не был случай, заданный в качестве примера, вы, вероятно, увидите другой типичный ввод, это НАЗВАНИЕ КЛАССА ОБОРУДОВАНИЯ, для которого этот метод не работает. - person Alexander Tsepkov; 13.02.2017
comment
@EdmundReed вы можете просто преобразовать всю строку в нижний регистр перед преобразованием в верблюжий регистр, связав метод .toLowerCase() в. Например. используя решение @ tabrindle выше: const toCamelCase = (str) => str.toLowerCase().replace(/(?:^\w|[A-Z]|\b\w)/g, (ltr, idx) => idx === 0 ? ltr.toLowerCase() : ltr.toUpperCase()).replace(/\s+/g, ''); - person bitfidget; 22.12.2017
comment
Будет ли это работать с _ MARK_BTNS_NEW, эта строка не преобразуется в регистр верблюда - person Aadam; 21.09.2018
comment
Для undescore с добавленным верхним регистром str = str.toLowerCase (). Replace (/ _ / g, ''); - person Aadam; 21.09.2018
comment
Не уверен, почему str.replace (/ (\ b \ w) / g) недостаточно хорош. toUpperCase () в любом случае не должен использоваться для символов, отличных от альфа. - person Keith Tyler; 08.03.2019
comment
@KeithTyler Всегда преобразует первый символ в верхний регистр - person Alex McCabe; 12.07.2019
comment
ПРИМЕЧАНИЕ: мне нужно было преобразовать строки snake_case (из столбцов БД), но это, похоже, не работает - person Sampgun; 16.07.2019
comment
плохо работает с умляутами и сокращениями. Напр .: camelize("ETA mit Männer") => "eTAMitMäNner" - person Vincente; 05.10.2020

Если кто-то использует lodash, существует _ 1_.

_.camelCase('Foo Bar');
// → 'fooBar'

_.camelCase('--foo-bar--');
// → 'fooBar'

_.camelCase('__FOO_BAR__');
// → 'fooBar'
person d4nyll    schedule 05.05.2016
comment
Этот ответ обязательно должен появиться в дальнейшем. Lodash предоставляет полный набор для преобразования строк между разными регистрами. - person btx; 26.08.2018
comment
Зачем устанавливать весь пакет lodash только для этой цели, а OP специально хотел решение с использованием регулярного выражения javascript. - person Peter Moses; 18.08.2020
comment
@PeterMoses 1) Мой ответ гласит: Если кто-то использует lodash, вам не следует устанавливать Lodash для этого 2) Хотя тело вопроса относится к JavaScript RegEx, многие люди попадают сюда, потому что заголовок читает Преобразование любой строки в случай верблюда 3) Вам не нужно импортировать всю библиотеку lodash; вы можете импортировать только те методы, которые вам нужны, или использовать пакеты для каждого метода например, lodash.camelcase вместо этого (который с тех пор устарел) 4) Вы можете уменьшить большие связка, реализовав встряхивание дерева - person d4nyll; 19.08.2020

Я только что сделал это:

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

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

person Scott Klarenbach    schedule 03.06.2010
comment
Мне это кажется прекрасным, и ничего подозрительного с точки зрения кроссбраузерности нет. (Не то чтобы я супер-эксперт или что-то в этом роде.) - person Pointy; 04.06.2010
comment
Если вы собираетесь использовать String.prototype, почему бы просто не использовать this вместо отправки параметра str? - person yincrash; 27.09.2011
comment
Не работает в Safari. ›Very active.toCamelCase ()‹ TypeError: undefined не является объектом (оценка 'str .replace') - person João Paulo Motta; 06.08.2015
comment
Для лучшей совместимости с браузером используйте это вместо str (и удалите параметр из вызова функции) - person João Paulo Motta; 06.08.2015
comment
Вам просто нужно использовать this.valueOf() вместо передачи str. В качестве альтернативы (как в моем случае) this.toLowerCase(), так как мои входные строки были ВСЕМИ ЗАГЛАВНЫМИ БУКВАМИ, в которых не было должным образом переведенных в нижний регистр частей без горба. Использование только this возвращает сам строковый объект, который на самом деле является массивом символов, отсюда и ошибка TypeError, упомянутая выше. - person Draco18s no longer trusts SE; 24.11.2015
comment
Это возвращает полную противоположность тому, что нужно. Это вернет СТРИНГ. - person Awol; 11.05.2017
comment
Скотт Кларенбах, Спасибо за хорошее решение. Это просто не работает, если между словами есть 2 пробела: toCamelCase('test test') => 'testtest'. Пожалуйста, обновите решение, добавив небольшое исправление. Первый RegExp должен быть /\s+(.)/g. - person Vincente; 05.10.2020

Чтобы получить c amel c ase

ES5

var camalize = function camalize(str) {
    return str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, function(match, chr)
    {
        return chr.toUpperCase();
    });
}

ES6

var camalize = function camalize(str) {
    return str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase());
}


Чтобы получить C amel S entence C ase или P ascal < strong> C ase

var camelSentence = function camelSentence(str) {
    return  (" " + str).toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, function(match, chr)
    {
        return chr.toUpperCase();
    });
}

Примечание.
Для языков с акцентами. Включите À-ÖØ-öø-ÿ в регулярное выражение, как показано ниже
.replace(/[^a-zA-ZÀ-ÖØ-öø-ÿ0-9]+(.)/g

person smilyface    schedule 28.09.2018
comment
Лучший ответ здесь - чистый и лаконичный. - person codeepic; 28.01.2019
comment
ES6 просто сделал для меня все строчные буквы - person C Bauer; 13.03.2019
comment
@Luis добавил https://stackoverflow.com/posts/52551910/revisions ES6, я не тестировал. Буду проверять и обновлять. - person smilyface; 13.03.2019
comment
Не работает для слов с диакритическими знаками jsbin.com/zayafedubo/edit?js,console - person Manuel Ortiz; 03.05.2019
comment
@ManuelOrtiz - jsbin.com/cibimatove/2/edit?js,console Я редактировал. Пожалуйста, проверьте. Также не возражайте, если это было многозначительное слово. Я не знаю языка с такими акцентами. Код .replace(/[^a-zA-ZÀ-ÖØ-öø-ÿ0-9]+(.)/g - person smilyface; 09.05.2019
comment
это не сработает, если вы передадите верблюжью строку. Нам нужно проверить, не обработали ли мы уже строку. - person Sheikh Abdul Wahid; 23.08.2019
comment
@SheikhAbdulWahid - Я еще не проверял ваш случай. Но это уже другой случай и для которого нужно условие !. Функция с camalize камализует его. Это все. Но, конечно, мы можем подумать о добавлении нового условия между ними. - person smilyface; 30.08.2019
comment
Это не работает правильно, когда строка открывается пробелом: `one two` -› OneTwo, должно быть oneTwo. Правильно работает в моем ответе;) - person vitaly-t; 14.01.2020
comment
вы можете попробовать добавить пробел в регулярное выражение, как я добавил другой языковой скрипт [^a-zA-Z0-9 ] - person smilyface; 16.01.2020

Вы можете использовать это решение:

function toCamelCase(str){
  return str.split(' ').map(function(word,index){
    // If it is the first word make sure to lowercase all the chars.
    if(index == 0){
      return word.toLowerCase();
    }
    // If it is not the first word only upper case the first char and lowercase the rest.
    return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
  }).join('');
}
person ismnoiet    schedule 13.03.2016
comment
Это прописные буквы, а не верблюд. - person nikk wong; 04.11.2016
comment
Верблюжий регистр - это первый символ каждого слова в заглавном регистре, и функция toCamelCase как раз делает это. - person ismnoiet; 04.11.2016
comment
Вы думаете о PascalCase. CamelCase может быть в верхнем или нижнем регистре. В этом контексте, во избежание путаницы, часто используется нижний регистр. - person Kody; 28.03.2017
comment
@Kody прав, вы путаете определения camelCase и PascalCase. - person cchamberlain; 22.04.2017
comment
Спасибо @Kody, @ cchamberlain за конструктивный комментарий, ознакомьтесь с обновленной версией. - person ismnoiet; 23.04.2017
comment
+1 за не использовать регулярные выражения, даже если в вопросе задано решение, использующее их. Это гораздо более четкое решение, а также явный выигрыш в производительности (потому что обработка сложных регулярных выражений - гораздо более сложная задача, чем просто итерация по кучке строк и объединение их кусочков вместе). См. jsperf.com/camel-casing-regexp-or-character-manipulation / 1, где я взял несколько примеров здесь вместе с этим (а также мое собственное скромное улучшение его производительности, хотя в большинстве случаев я, вероятно, предпочел бы эту версию для ясности). - person Jules; 20.10.2017
comment
.join('') в конце требует места. В противном случае это хорошее решение - person Jeff Sheffield; 07.08.2018

В конкретном случае со Скоттом я бы использовал что-то вроде:

String.prototype.toCamelCase = function() {
    return this.replace(/^([A-Z])|\s(\w)/g, function(match, p1, p2, offset) {
        if (p2) return p2.toUpperCase();
        return p1.toLowerCase();        
    });
};

'EquipmentClass name'.toCamelCase()  // -> equipmentClassName
'Equipment className'.toCamelCase()  // -> equipmentClassName
'equipment class name'.toCamelCase() // -> equipmentClassName
'Equipment Class Name'.toCamelCase() // -> equipmentClassName

Регулярное выражение будет соответствовать первому символу, если оно начинается с заглавной буквы, и любому алфавитному символу, следующему за пробелом, то есть 2 или 3 раза в указанных строках.

Приправляя регулярное выражение до /^([A-Z])|[\s-_](\w)/g, оно также превращает имена типов в дефис и подчеркивание.

'hyphen-name-format'.toCamelCase()     // -> hyphenNameFormat
'underscore_name_format'.toCamelCase() // -> underscoreNameFormat
person Fredric    schedule 05.04.2013
comment
что, если в строке больше 2,3 дефисов или подчеркиваний, например .data-product-name, .data-product-description, .product-container__actions - price, .photo-placeholder__photo - person Ashwani Shukla; 10.02.2017
comment
@AshwaniShukla Чтобы обрабатывать несколько дефисов и / или подчеркиваний, вам нужно будет добавить множитель (+) к группе символов, то есть: /^([A-Z])|[\s-_]+(\w)/g - person Fredric; 22.02.2017

function toCamelCase(str) {
  // Lower cases the string
  return str.toLowerCase()
    // Replaces any - or _ characters with a space 
    .replace( /[-_]+/g, ' ')
    // Removes any non alphanumeric characters 
    .replace( /[^\w\s]/g, '')
    // Uppercases the first character in each group immediately following a space 
    // (delimited by spaces) 
    .replace( / (.)/g, function($1) { return $1.toUpperCase(); })
    // Removes spaces 
    .replace( / /g, '' );
}

Я пытался найти функцию JavaScript для camelCase строки и хотел убедиться, что специальные символы будут удалены (и мне было трудно понять, что делали некоторые из приведенных выше ответов). Это основано на ответе c c young с добавленными комментариями и удалением символов $ peci & l.

person Eilidh    schedule 16.09.2015

Пример надежного, высокопроизводительного:

function camelize(text) {
    text = text.replace(/[-_\s.]+(.)?/g, (_, c) => c ? c.toUpperCase() : '');
    return text.substr(0, 1).toLowerCase() + text.substr(1);
}

Символы, меняющие регистр:

  • дефис -
  • подчеркивание _
  • период .
  • космос
person vitaly-t    schedule 13.09.2019

Если регулярное выражение не требуется, вы можете посмотреть следующий код, который я сделал много лет назад для 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 );
}

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

person azatoth    schedule 04.06.2010
comment
В среднем в 5 раз быстрее, если вам нужно всего одно слово jsbin.com/wuvagenoka/edit? html, js, вывод - person Omu; 05.08.2016

Мой подход ES6:

const camelCase = str => {
  let string = str.toLowerCase().replace(/[^A-Za-z0-9]/g, ' ').split(' ')
                  .reduce((result, word) => result + capitalize(word.toLowerCase()))
  return string.charAt(0).toLowerCase() + string.slice(1)
}

const capitalize = str => str.charAt(0).toUpperCase() + str.toLowerCase().slice(1)

let baz = 'foo bar'
let camel = camelCase(baz)
console.log(camel)  // "fooBar"
camelCase('foo bar')  // "fooBar"
camelCase('FOO BAR')  // "fooBar"
camelCase('x nN foo bar')  // "xNnFooBar"
camelCase('!--foo-¿?-bar--121-**%')  // "fooBar121"
person eledgaar    schedule 02.08.2017
comment
как насчет таких имен, как Жан-Пьер? - person Max Alexander Hanna; 01.11.2018

Вот один лайнер, выполняющий всю работу:

const camelCaseIt = string => string.toLowerCase().trim().split(/[.\-_\s]/g).reduce((string, word) => string + word[0].toUpperCase() + word.slice(1));

Он разбивает строку в нижнем регистре на основе списка символов, предоставленного в RegExp [.\-_\s] (добавьте больше внутри []!), И возвращает массив слов. Затем он сокращает массив строк до одной конкатенированной строки слов с первыми буквами в верхнем регистре. Поскольку сокращение не имеет начального значения, первые буквы будут начинаться с верхнего регистра, начиная со второго слова.

Если вам нужен PascalCase, просто добавьте начальную пустую строку ,'') в метод reduce.

person Martin Szyska    schedule 18.06.2018

lodash наверняка и хорошо справится с задачей:

var _ = require('lodash');
var result = _.camelCase('toto-ce héros') 
// result now contains "totoCeHeros"

Хотя lodash может быть «большой» библиотекой (~ 4 КБ), она содержит множество функций, для которых вы обычно используете сниппет или создаете сами.

person Alain Beauvois    schedule 29.07.2016
comment
есть модули npm с каждой отдельной функцией lodash, поэтому вам не нужно импортировать всю большую библиотеку: npmjs .com / package / lodash.camelcase - person gion_13; 27.09.2019

Главный ответ краток, но он не касается всех крайних случаев. Для тех, кому нужна более надежная утилита без каких-либо внешних зависимостей:

function camelCase(str) {
    return (str.slice(0, 1).toLowerCase() + str.slice(1))
      .replace(/([-_ ]){1,}/g, ' ')
      .split(/[-_ ]/)
      .reduce((cur, acc) => {
        return cur + acc[0].toUpperCase() + acc.substring(1);
      });
}

function sepCase(str, sep = '-') {
    return str
      .replace(/[A-Z]/g, (letter, index) => {
        const lcLet = letter.toLowerCase();
        return index ? sep + lcLet : lcLet;
      })
      .replace(/([-_ ]){1,}/g, sep)
}

// All will return 'fooBarBaz'
console.log(camelCase('foo_bar_baz'))
console.log(camelCase('foo-bar-baz'))
console.log(camelCase('foo_bar--baz'))
console.log(camelCase('FooBar  Baz'))
console.log(camelCase('FooBarBaz'))
console.log(camelCase('fooBarBaz'))

// All will return 'foo-bar-baz'
console.log(sepCase('fooBarBaz'));
console.log(sepCase('FooBarBaz'));
console.log(sepCase('foo-bar-baz'));
console.log(sepCase('foo_bar_baz'));
console.log(sepCase('foo___ bar -baz'));
console.log(sepCase('foo-bar-baz'));

// All will return 'foo__bar__baz'
console.log(sepCase('fooBarBaz', '__'));
console.log(sepCase('foo-bar-baz', '__'));

Демо здесь: https://codesandbox.io/embed/admiring-field-dnm4r?fontsize=14&hidenavigation=1&theme=dark

person kohloth    schedule 18.07.2020
comment
А как насчет первого персонажа? - person M_droid; 30.09.2020
comment
@M_droid Я не понимаю. - person kohloth; 10.10.2020

Потому что на этот вопрос нужен был еще один ответ ...

Я пробовал несколько предыдущих решений, и все они имели тот или иной недостаток. Некоторые не убирали пунктуацию; некоторые не занимались делами с числами; некоторые не обрабатывали несколько знаков препинания подряд.

Ни один из них не обрабатывал строку, подобную a1 2b. Для этого случая нет явно определенного соглашения, но есть некоторые другие В вопросах stackoverflow предлагалось разделять числа знаком подчеркивания.

Я сомневаюсь, что это самый эффективный ответ (через строку проходят три регулярных выражения, а не одно или два), но он проходит все тесты, которые я могу придумать. Однако, честно говоря, я действительно не могу представить себе случай, когда вы делаете так много конверсий по принципу верблюда, что производительность будет иметь значение.

(Я добавил это как пакет npm. Он также включает необязательный логический параметр для возврата Паскаль Case вместо Camel Case.)

const underscoreRegex = /(?:[^\w\s]|_)+/g,
    sandwichNumberRegex = /(\d)\s+(?=\d)/g,
    camelCaseRegex = /(?:^\s*\w|\b\w|\W+)/g;

String.prototype.toCamelCase = function() {
    if (/^\s*_[\s_]*$/g.test(this)) {
        return '_';
    }

    return this.replace(underscoreRegex, ' ')
        .replace(sandwichNumberRegex, '$1_')
        .replace(camelCaseRegex, function(match, index) {
            if (/^\W+$/.test(match)) {
                return '';
            }

            return index == 0 ? match.trimLeft().toLowerCase() : match.toUpperCase();
        });
}

Тестовые примеры (Jest)

test('Basic strings', () => {
    expect(''.toCamelCase()).toBe('');
    expect('A B C'.toCamelCase()).toBe('aBC');
    expect('aB c'.toCamelCase()).toBe('aBC');
    expect('abc      def'.toCamelCase()).toBe('abcDef');
    expect('abc__ _ _def'.toCamelCase()).toBe('abcDef');
    expect('abc__ _ d_ e _ _fg'.toCamelCase()).toBe('abcDEFg');
});

test('Basic strings with punctuation', () => {
    expect(`a'b--d -- f.h`.toCamelCase()).toBe('aBDFH');
    expect(`...a...def`.toCamelCase()).toBe('aDef');
});

test('Strings with numbers', () => {
    expect('12 3 4 5'.toCamelCase()).toBe('12_3_4_5');
    expect('12 3 abc'.toCamelCase()).toBe('12_3Abc');
    expect('ab2c'.toCamelCase()).toBe('ab2c');
    expect('1abc'.toCamelCase()).toBe('1abc');
    expect('1Abc'.toCamelCase()).toBe('1Abc');
    expect('abc 2def'.toCamelCase()).toBe('abc2def');
    expect('abc-2def'.toCamelCase()).toBe('abc2def');
    expect('abc_2def'.toCamelCase()).toBe('abc2def');
    expect('abc1_2def'.toCamelCase()).toBe('abc1_2def');
    expect('abc1 2def'.toCamelCase()).toBe('abc1_2def');
    expect('abc1 2   3def'.toCamelCase()).toBe('abc1_2_3def');
});

test('Oddball cases', () => {
    expect('_'.toCamelCase()).toBe('_');
    expect('__'.toCamelCase()).toBe('_');
    expect('_ _'.toCamelCase()).toBe('_');
    expect('\t_ _\n'.toCamelCase()).toBe('_');
    expect('_a_'.toCamelCase()).toBe('a');
    expect('\''.toCamelCase()).toBe('');
    expect(`\tab\tcd`.toCamelCase()).toBe('abCd');
    expect(`
ab\tcd\r

-_

|'ef`.toCamelCase()).toBe(`abCdEf`);
});
person dx_over_dt    schedule 11.10.2018
comment
Отличная работа, спасибо. Обрабатывает гораздо больше сценариев по сравнению с другими элементарными ответами. - person sean2078; 04.01.2020

Эта функция пропускает cammelcase, например, эти тесты

  • Foo Bar
  • --foo-bar--
  • __FOO_BAR__-
  • foo123Bar
  • foo_Bar

function toCamelCase(str)
{
  var arr= str.match(/[a-z]+|\d+/gi);
  return arr.map((m,i)=>{
    let low = m.toLowerCase();
    if (i!=0){
      low = low.split('').map((s,k)=>k==0?s.toUpperCase():s).join``
    }
    return low;
  }).join``;
}
console.log(toCamelCase('Foo      Bar'));
console.log(toCamelCase('--foo-bar--'));
console.log(toCamelCase('__FOO_BAR__-'));
console.log(toCamelCase('foo123Bar'));
console.log(toCamelCase('foo_Bar'));

console.log(toCamelCase('EquipmentClass name'));
console.log(toCamelCase('Equipment className'));
console.log(toCamelCase('equipment class name'));
console.log(toCamelCase('Equipment Class Name'));

person Pascal Tovohery    schedule 07.01.2021
comment
Преобразование верблюжьего типа на основе алгоритмов - это огромный перебор и снижение производительности. - person vitaly-t; 23.03.2021

немного модифицированный ответ Скотта:

toCamelCase = (string) ->
  string
    .replace /[\s|_|-](.)/g, ($1) -> $1.toUpperCase()
    .replace /[\s|_|-]/g, ''
    .replace /^(.)/, ($1) -> $1.toLowerCase()

теперь он заменяет также "-" и "_".

person sunstory    schedule 27.07.2015

Все 14 перестановок ниже дают один и тот же результат «equipmentClassName».

String.prototype.toCamelCase = function() {
  return this.replace(/[^a-z ]/ig, '')  // Replace everything but letters and spaces.
    .replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, // Find non-words, uppercase letters, leading-word letters, and multiple spaces.
      function(match, index) {
        return +match === 0 ? "" : match[index === 0 ? 'toLowerCase' : 'toUpperCase']();
      });
}

String.toCamelCase = function(str) {
  return str.toCamelCase();
}

var testCases = [
  "equipment class name",
  "equipment class Name",
  "equipment Class name",
  "equipment Class Name",
  "Equipment class name",
  "Equipment class Name",
  "Equipment Class name",
  "Equipment Class Name",
  "equipment className",
  "equipment ClassName",
  "Equipment ClassName",
  "equipmentClass name",
  "equipmentClass Name",
  "EquipmentClass Name"
];

for (var i = 0; i < testCases.length; i++) {
  console.log(testCases[i].toCamelCase());
};

person Mr. Polywhirl    schedule 14.09.2015
comment
Ага. Мне нравится использование методов-прототипов со строками, а не с функциями. Это помогает с цепочкой. - person russellmania; 15.04.2016

вы можете использовать это решение:

String.prototype.toCamelCase = function(){
  return this.replace(/\s(\w)/ig, function(all, letter){return letter.toUpperCase();})
             .replace(/(^\w)/, function($1){return $1.toLowerCase()});
};

console.log('Equipment className'.toCamelCase());

person Chang Hoon Lee    schedule 14.05.2016
comment
В этом примере показано, как использовать две другие функции в методе замены. - person Chang Hoon Lee; 14.05.2016

Вот мое предложение:

function toCamelCase(string) {
  return `${string}`
    .replace(new RegExp(/[-_]+/, 'g'), ' ')
    .replace(new RegExp(/[^\w\s]/, 'g'), '')
    .replace(
      new RegExp(/\s+(.)(\w+)/, 'g'),
      ($1, $2, $3) => `${$2.toUpperCase() + $3.toLowerCase()}`
    )
    .replace(new RegExp(/\s/, 'g'), '')
    .replace(new RegExp(/\w/), s => s.toLowerCase());
}

or

String.prototype.toCamelCase = function() {
  return this
    .replace(new RegExp(/[-_]+/, 'g'), ' ')
    .replace(new RegExp(/[^\w\s]/, 'g'), '')
    .replace(
      new RegExp(/\s+(.)(\w+)/, 'g'),
      ($1, $2, $3) => `${$2.toUpperCase() + $3.toLowerCase()}`
    )
    .replace(new RegExp(/\s/, 'g'), '')
    .replace(new RegExp(/\w/), s => s.toLowerCase());
};

Тестовые случаи:

describe('String to camel case', function() {
  it('should return a camel cased string', function() {
    chai.assert.equal(toCamelCase('foo bar'), 'fooBar');
    chai.assert.equal(toCamelCase('Foo Bar'), 'fooBar');
    chai.assert.equal(toCamelCase('fooBar'), 'fooBar');
    chai.assert.equal(toCamelCase('FooBar'), 'fooBar');
    chai.assert.equal(toCamelCase('--foo-bar--'), 'fooBar');
    chai.assert.equal(toCamelCase('__FOO_BAR__'), 'fooBar');
    chai.assert.equal(toCamelCase('!--foo-¿?-bar--121-**%'), 'fooBar121');
  });
});
person kalicki2k    schedule 28.12.2018

Вот мое решение:

const toCamelWord = (word, idx) =>
  idx === 0 ?
  word.toLowerCase() :
  word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();

const toCamelCase = text =>
  text
  .split(/[_-\s]+/)
  .map(toCamelWord)
  .join("");

console.log(toCamelCase('User ID'))

person Daniil Khudiakov    schedule 22.05.2018

следуя удобочитаемому подходу @ Scott, небольшая настройка

// convert any string to camelCase
var toCamelCase = function(str) {
  return str.toLowerCase()
    .replace( /['"]/g, '' )
    .replace( /\W+/g, ' ' )
    .replace( / (.)/g, function($1) { return $1.toUpperCase(); })
    .replace( / /g, '' );
}
person cc young    schedule 02.11.2012
comment
Преобразование верблюда можно легко выполнить с помощью 1 replace, а не 4. - person vitaly-t; 23.03.2021

Этот метод, кажется, превосходит большинство ответов здесь, хотя он немного взломан, без замен, без регулярного выражения, просто создание новой строки, которая является camelCase.

String.prototype.camelCase = function(){
    var newString = '';
    var lastEditedIndex;
    for (var i = 0; i < this.length; i++){
        if(this[i] == ' ' || this[i] == '-' || this[i] == '_'){
            newString += this[i+1].toUpperCase();
            lastEditedIndex = i+1;
        }
        else if(lastEditedIndex !== i) newString += this[i].toLowerCase();
    }
    return newString;
}
person Thieu    schedule 21.01.2016

Это основано на ответе CMS путем удаления любых неалфавитных символов, включая подчеркивание, которое \w не удаляет.

function toLowerCamelCase(str) {
    return str.replace(/[^A-Za-z0-9]/g, ' ').replace(/^\w|[A-Z]|\b\w|\s+/g, function (match, index) {
        if (+match === 0 || match === '-' || match === '.' ) {
            return ""; // or if (/\s+/.test(match)) for white spaces
        }
        return index === 0 ? match.toLowerCase() : match.toUpperCase();
    });
}

toLowerCamelCase("EquipmentClass name");
toLowerCamelCase("Equipment className");
toLowerCamelCase("equipment class name");
toLowerCamelCase("Equipment Class Name");
toLowerCamelCase("Equipment-Class-Name");
toLowerCamelCase("Equipment_Class_Name");
toLowerCamelCase("Equipment.Class.Name");
toLowerCamelCase("Equipment/Class/Name");
// All output e
person wheeler    schedule 18.03.2016

Верхний регистр верблюда ("TestString") в нижний регистр верблюда ("testString") без использования регулярного выражения (давайте посмотрим правде в глаза, регулярное выражение - зло):

'TestString'.split('').reduce((t, v, k) => t + (k === 0 ? v.toLowerCase() : v), '');
person Christoph Bühler    schedule 10.05.2017
comment
Односимвольные параметры по-прежнему немного плохи с точки зрения удобочитаемости - person danwellman; 14.02.2018

В итоге я придумал более агрессивное решение:

function toCamelCase(str) {
  const [first, ...acc] = str.replace(/[^\w\d]/g, ' ').split(/\s+/);
  return first.toLowerCase() + acc.map(x => x.charAt(0).toUpperCase() 
    + x.slice(1).toLowerCase()).join('');
}

Этот, приведенный выше, удалит все не буквенно-цифровые символы и строчные части слов, которые в противном случае остались бы в верхнем регистре, например

  • Size (comparative) => sizeComparative
  • GDP (official exchange rate) => gdpOfficialExchangeRate
  • hello => hello
person bjornl    schedule 11.07.2017

Я знаю, что это старый ответ, но он обрабатывает как пробелы, так и _ (lodash)

function toCamelCase(s){
    return s
          .replace(/_/g, " ")
          .replace(/\s(.)/g, function($1) { return $1.toUpperCase(); })
          .replace(/\s/g, '')
          .replace(/^(.)/, function($1) { return $1.toLowerCase(); });
}

console.log(toCamelCase("Hello world");
console.log(toCamelCase("Hello_world");

// Both print "helloWorld"
person Sampgun    schedule 16.07.2019
comment
Спасибо за это, но, кажется, есть случайный " в .replace(/_/g", " "), который вызывает ошибки компиляции? - person Crashalot; 27.09.2019

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

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

person Pointy    schedule 03.06.2010

РЕДАКТИРОВАТЬ: теперь работает в IE8 без изменений.

РЕДАКТИРОВАТЬ: я был в меньшинстве в том, что такое camelCase на самом деле (нижний регистр ведущих символов по сравнению с верхним регистром). Сообщество в целом считает, что первая строчная буква - это верблюжий регистр, а ведущая заглавная - паскаль. Я создал две функции, которые используют только шаблоны регулярных выражений. :) Итак, мы используем единый словарь. Я изменил свою позицию, чтобы соответствовать большинству.


Все, что я считаю, вам нужно, это одно регулярное выражение в любом случае:

var camel = " THIS is camel case "
camel = $.trim(camel)
    .replace(/[^A-Za-z]/g,' ') /* clean up non-letter characters */
    .replace(/(.)/g, function(a, l) { return l.toLowerCase(); })
    .replace(/(\s.)/g, function(a, l) { return l.toUpperCase(); })
    .replace(/[^A-Za-z\u00C0-\u00ff]/g,'');
// Returns "thisIsCamelCase"

or

var pascal = " this IS pascal case "
pascal = $.trim(pascal)
  .replace(/[^A-Za-z]/g,' ') /* clean up non-letter characters */
  .replace(/(.)/g, function(a, l) { return l.toLowerCase(); })
  .replace(/(^.|\s.)/g, function(a, l) { return l.toUpperCase(); })
  .replace(/[^A-Za-z\u00C0-\u00ff]/g,'');
// Returns "ThisIsPascalCase"

В функциях: вы заметите, что в этих функциях замена заменяет любые символы, отличные от a-z, на пробел и пустую строку. Это необходимо для создания границ слов для использования заглавных букв. "hello-MY # world" -> "HelloMyWorld"

// remove \u00C0-\u00ff] if you do not want the extended letters like é
function toCamelCase(str) {
    var retVal = '';

    retVal = $.trim(str)
      .replace(/[^A-Za-z]/g, ' ') /* clean up non-letter characters */
      .replace(/(.)/g, function (a, l) { return l.toLowerCase(); })
      .replace(/(\s.)/g, function (a, l) { return l.toUpperCase(); })
      .replace(/[^A-Za-z\u00C0-\u00ff]/g, '');

    return retVal
}

function toPascalCase(str) {
    var retVal = '';

    retVal = $.trim(str)
      .replace(/[^A-Za-z]/g, ' ') /* clean up non-letter characters */
      .replace(/(.)/g, function (a, l) { return l.toLowerCase(); })
      .replace(/(^.|\s.)/g, function (a, l) { return l.toUpperCase(); })
      .replace(/[^A-Za-z\u00C0-\u00ff]/g, '');

    return retVal
}

Примечания:

  • Я оставил A-Za-z вместо добавления флага нечувствительности к регистру (i) в шаблон (/ [^ A-Z] / ig) для удобства чтения.
  • Это работает в IE8 (правда, кто больше использует IE8). Используя инструменты разработки (F12), которые я тестировал в IE11, IE10, IE9, IE8, IE7 и IE5. Работает во всех режимах документа.
  • Так будет правильно регистрироваться первая буква строк, начинающаяся с пробела или без него.

Наслаждаться

person Joe Johnston    schedule 18.12.2016
comment
Первая буква все еще заглавная? - person Dave Clarke; 03.03.2017
comment
да. Он будет начинаться с заглавной буквы в том случае, если для начала он будет нижним или верхним. - person Joe Johnston; 04.03.2017
comment
Ну, это не случай с верблюдом - и не соответствует тому, что запросил OP? - person Dave Clarke; 08.03.2017
comment
Надеюсь, это редактирование дает результаты, которые искал OP. Всю жизнь я понятия не имел, за что был проголосован против. Не отвечая на OP ... Вот и все. :) - person Joe Johnston; 08.03.2017
comment
Я считаю, что PascalCase - это то, что мы называем camelCase с заглавной буквы. - person Ted Morin; 05.05.2017
comment
Я надеюсь, что теперь это соответствует мнению сообщества в целом. - person Joe Johnston; 08.05.2017

Не используйте String.prototype.toCamelCase (), поскольку String.prototypes доступны только для чтения, большинство компиляторов js выдают это предупреждение.

Как и я, те, кто знает, что строка всегда будет содержать только один пробел, могут использовать более простой подход:

let name = 'test string';

let pieces = name.split(' ');

pieces = pieces.map((word, index) => word.charAt(0)[index===0 ? 'toLowerCase' :'toUpperCase']() + word.toLowerCase().slice(1));

return pieces.join('');

Хорошего дня. :)

person Jaskaran Singh    schedule 21.01.2019

Я придумал этот лайнер, который также работает с футляром для кебаба в CamelCase:

string.replace(/^(.)|[\s-](.)/g,
                (match) =>
                    match[1] !== undefined
                        ? match[1].toUpperCase()
                        : match[0].toUpperCase()
            )
person digitalniweb    schedule 22.07.2021

Я думаю, это должно сработать ..

function cammelCase(str){
    let arr = str.split(' ');
    let words = arr.filter(v=>v!='');
    words.forEach((w, i)=>{
        words[i] = w.replace(/\w\S*/g, function(txt){
            return txt.charAt(0).toUpperCase() + txt.substr(1);
        });
    });
    return words.join('');
}
person Darryl Ceguerra    schedule 17.08.2018

Супер простой способ с помощью библиотеки turboCommons:

npm install turbocommons-es5

<script src="turbocommons-es5/turbocommons-es5.js"></script>

<script>
    var StringUtils = org_turbocommons.StringUtils;
    console.log(StringUtils.formatCase('EquipmentClass', StringUtils.FORMAT_LOWER_CAMEL_CASE));
    console.log(StringUtils.formatCase('Equipment className', StringUtils.FORMAT_LOWER_CAMEL_CASE));
    console.log(StringUtils.formatCase('equipment class name', StringUtils.FORMAT_LOWER_CAMEL_CASE));
    console.log(StringUtils.formatCase('Equipment Class Name', StringUtils.FORMAT_LOWER_CAMEL_CASE));
</script>

Вы также можете использовать StringUtils.FORMAT_CAMEL_CASE и StringUtils.FORMAT_UPPER_CAMEL_CASE для создания вариантов регистра первой буквы.

Больше информации здесь:

Преобразовать строку в CamelCase, UpperCamelCase или нижеCamelCase

person Jaume Mussons Abad    schedule 04.11.2018
comment
Целая библиотека для однострочной реализации - это безумие. - person vitaly-t; 23.03.2021
comment
Если не поленитесь, зайдите на страницу библиотеки github и посмотрите код этой реализации. Кроме того, вы бесплатно получите множество распространенных однострочных реализаций, которые помогут вам в повседневных задачах разработки. - person Jaume Mussons Abad; 24.03.2021
comment
Не называй меня ленивым. Я опубликовал однострочное решение вопроса, не пытаясь увлечь людей в какую-то неизвестную библиотеку, которую вы здесь рекламируете. - person vitaly-t; 29.03.2021