Преобразование любой строки в случай верблюда

171

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

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

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

Скотт Кларенбах
источник
1
Я сделал jsperf тест различных методов. результаты были немного неубедительными. похоже, это зависит от входной строки.
Инкраш
Новый тест jsperf с несколькими различными строками для тестирования и большим количеством реализаций: jsperf.com/camel-casing-regexp-or-character-manipulation/1 - это приводит меня к выводу, что для среднего случая, несмотря на если вы зададите этот вопрос задаче, регулярные выражения - это не то, что вам нужно. Мало того, что их намного сложнее понять, они также (по крайней мере, для текущих версий Chrome) работают примерно вдвое дольше.
Жюль

Ответы:

237

Глядя на свой код, вы можете достичь его всего двумя 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();
  });
}
CMS
источник
4
Отличный код, и в итоге он выиграл jsperf.com/js-camelcase/5 . Хотите добавить версию, которая может обрабатывать (удалять) не альфа-символы? camelize("Let's Do It!") === "let'SDoIt!" печальное лицо . Я попробую себя, но боюсь, я просто добавлю другую замену.
Орвеллофил
2
.. поскольку не альфа не должен влиять на случай, я не уверен, что это можно сделать лучше, чем return this.replace(/[^a-z ]/ig, '').replace(/(?:^\w|[A-Z]|\b\w|\s+)/g,...
Орвеллофил
4
Для моих друзей ES2015 +: один вкладыш на основе приведенного выше кода. const toCamelCase = (str) => str.replace(/(?:^\w|[A-Z]|\b\w)/g, (ltr, idx) => idx === 0 ? ltr.toLowerCase() : ltr.toUpperCase()).replace(/\s+/g, '');
tabrindle
2
Хотя это не случай, заданный примером, другой типичный вход, который вы, вероятно, увидите, - «ИМЯ КЛАССА ОБОРУДОВАНИЯ», для которого этот метод не работает.
Александр Цепков
1
@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, '');
bitfidget
103

Если кто-то использует lodash , есть _.camelCase()функция.

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

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

_.camelCase('__FOO_BAR__');
// → 'fooBar'
d4nyll
источник
2
Этот ответ обязательно должен появиться дальше. Lodash предоставляет полный набор для преобразования строк между различными случаями.
Btx
55

Я только что закончил делать это:

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 в моей функции. Но такой тип группирования трудно понять, и о вашем упоминании о кросс-браузерных проблемах я тоже никогда не задумывался.

Скотт Кларенбах
источник
1
Это выглядит хорошо для меня, и ничто не выглядит подозрительно, поскольку кросс-браузерные проблемы. (Не то, что я супер-эксперт или что - нибудь.)
Заостренный
47
Если вы собираетесь использовать String.prototype, почему бы просто не использовать 'this' вместо отправки параметра 'str'?
Инкраш
6
Для лучшей совместимости браузера, пожалуйста, используйте это вместо str (и удалите параметр из вызова функции)
João Paulo Motta
2
Вам просто нужно использовать this.valueOf()вместо прохождения str. В качестве альтернативы (как в моем случае), this.toLowerCase()поскольку мои входные строки были во ВСЕХ CAPS, в которых не горбатые части были должным образом опущены. Использование just thisвозвращает сам строковый объект, который на самом деле является массивом char, отсюда и TypeError, упомянутый выше.
Draco18s больше не доверяет SE
2
Это возвращает полную противоположность того, что нужно. Это вернет STRING.
Авол
41

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

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('');
}
ismnoiet
источник
Это прописные буквы, а не верблюд.
Никк Вонг
2
Регистр верблюдов - первый символ каждого слова в заглавной букве, и toCamelCaseфункция просто делает это.
ismnoiet
2
Вы думаете о PascalCase . CamelCase может быть в верхнем или нижнем регистре. В этом контексте это часто строчные буквы, чтобы избежать путаницы.
Коди
1
Спасибо @Kody, @ cchamberlain за ваш конструктивный комментарий, закажите обновленную версию.
ismnoiet
5
+1 за не использовать регулярные выражения, даже если вопрос , заданный для решения с помощью их. Это гораздо более четкое решение, а также явный выигрыш в производительности (поскольку обработка сложных регулярных выражений является гораздо более сложной задачей, чем просто итерирование по ряду строк и их объединение). См. Jsperf.com/camel-casing-regexp-or-character-manipulation/1, где я взял некоторые примеры здесь вместе с этим (а также мое собственное скромное улучшение для производительности, хотя я, вероятно, предпочел бы это версия для наглядности в большинстве случаев).
Жюль
41

Чтобы получить с Амель C аза

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 Амель S entence C азу или P ascal C аза

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

smilyface
источник
4
Лучший ответ здесь - чистый и лаконичный.
Codeepic
5
ES6 только что сделал все строчными для меня
C Bauer
@Luis добавил https://stackoverflow.com/posts/52551910/revisionsES6, я не тестировал его. Я проверю и обновлю.
smilyface
Не работает для слов с акцентами jsbin.com/zayafedubo/edit?js,console
Мануэль Ортис
1
это не будет работать, если вы передадите верблюжью строку. Нам нужно проверить, есть ли у нас уже камализованная строка.
Шейх Абдул Вахид
27

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

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
Фредрик
источник
Что, если в строке более 2,3 гипс или подчеркиваний, таких как .data-product-name, .data-product-description, .product-container__actions - цена, .photo-placeholder__photo
Ашвани Шукла
1
@AshwaniShukla Для обработки нескольких дефисов и / или подчеркиваний вам нужно добавить множитель ( +) в группу символов, а именно:/^([A-Z])|[\s-_]+(\w)/g
Фредрик
21
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строки и хотел убедиться, что специальные символы будут удалены (и мне было трудно понять, что делали некоторые из приведенных выше ответов). Это основано на ответе cc young, с добавленными комментариями и удалением символов $ peci & l.

Эйлид
источник
10

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

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

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

  • дефис -
  • нижнее подчеркивание _
  • период .
  • пространство
виталий-т
источник
9

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

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

azatoth
источник
5x раз быстрее , в среднем, если вам нужно только 1 слово jsbin.com/wuvagenoka/edit?html,js,output
ИМУ
8

Мой подход 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"
eledgaar
источник
а как насчет имен типа Жан-Пьер?
Макс Александр Ханна
5
return "hello world".toLowerCase().replace(/(?:(^.)|(\s+.))/g, function(match) {
    return match.charAt(match.length-1).toUpperCase();
}); // HelloWorld
Джуджин Майлз
источник
5

Lodash может сделать свое дело уверенно и хорошо:

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

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

Ален Бовуа
источник
есть модули npm с каждой отдельной функцией lodash, поэтому вам не нужно импортировать всю «большую» библиотеку: npmjs.com/package/lodash.camelcase
gion_13
5

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

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

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

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

Мартин Шиска
источник
3

после читабельного подхода @ Скотта, немного тонкой настройки

// преобразовать любую строку в camelCase
var toCamelCase = function (str) {
  return str.toLowerCase ()
    .replace (/ ['"] / g,' ')
    .replace (/ \ W + / g, '')
    .replace (/ (.) / g, function ($ 1) {return $ 1.toUpperCase ();})
    .replace (/ / g, '');
}
молодой
источник
3

немного измененный ответ Скотта:

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

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

sunstory
источник
3

Все 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());
};

Мистер Поливирл
источник
Да. Мне нравится использование методов-прототипов со строками, а не с функциями. Это помогает с цепочкой.
russellmania
3

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

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());

Чанг Хун Ли
источник
В этом примере показано, как использовать две другие функции в методе замены.
Чанг Хун Ли
3

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

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

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

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

(Я добавил это как пакет npm . Он также включает необязательный логический параметр для возврата Pascal 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`);
});
dx_over_dt
источник
Отличная работа, спасибо. Обрабатывает намного больше сценариев по сравнению с другими простыми ответами.
sean2078
2

Есть мое решение:

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'))

Даниил Худяков
источник
1

Похоже, что этот метод превосходит большинство ответов здесь, он немного хакерский, но без замен, без регулярных выражений, просто создает новую строку, которая является 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;
}
Thieu
источник
1

Это основывается на ответе 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
Уилер
источник
1

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

'TestString'.split('').reduce((t, v, k) => t + (k === 0 ? v.toLowerCase() : v), '');
Кристоф Бюлер
источник
2
Односимвольные
1

Я закончил тем, что создал немного более агрессивное решение:

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
bjornl
источник
1
function convertStringToCamelCase(str){
    return str.split(' ').map(function(item, index){
        return index !== 0 
            ? item.charAt(0).toUpperCase() + item.substr(1) 
            : item.charAt(0).toLowerCase() + item.substr(1);
    }).join('');
}      
user6921695
источник
1

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

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());
}

или

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');
  });
});
kalicki2k
источник
1

Я знаю, что это старый ответ, но он обрабатывает пробелы и _ (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"
Sampgun
источник
Спасибо за это, но, как представляется, бродячая "в .replace(/_/g", " ")том , что ошибки компиляции причины?
Crashalot
1
const toCamelCase = str =>
  str
    .replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase())
    .replace(/^\w/, c => c.toLowerCase());
Гаурав Могха
источник
0

РЕДАКТИРОВАТЬ : Теперь работает в 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"

или

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"

В функциях: вы заметите, что в этих функциях замена заменяет любой не-AZ пробелом на пустую строку. Это создать границы слов для заглавных букв. "привет-мой # мир" -> "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) к шаблону (/ [^ AZ] / ig) для удобства чтения.
  • Это работает в IE8 (srsly, который больше использует IE8.) Используя инструменты разработчика (F12), которые я тестировал в IE11, IE10, IE9, IE8, IE7 и IE5. Работает во всех режимах документа.
  • Это будет правильно, если первая строка строк начинается с пробела или без него.

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

Джо Джонстон
источник
Первая буква все еще заглавная?
Дейв Кларк
Да. Он будет написан с заглавной буквы в том случае, если он ниже или выше для начала.
Джо Джонстон
2
Ну, это не верблюжий случай - и не соответствует тому, что запросил ОП?
Дейв Кларк,
Надеемся, что это редактирование даст результаты, которые ищет ОП. Из-за моей жизни я понятия не имел, для чего был понижающий голос. Не отвечая на ОП ... Это сделает это. :)
Джо Джонстон
1
Я считаю, что «PascalCase» - это то, что мы называем CamelCase с лидирующим капиталом.
Тед Морен
0

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

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('');
}
Дэррил Сегуэрра
источник
0

Не используйте 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('');

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

Яскаран Сингх
источник