Перетворення будь-якої струни в корпус верблюда


171

Як я можу перетворити рядок у корпус верблюда за допомогою jage regex?

EquipmentClass nameабо Equipment classNameабо equipment class nameабоEquipment Class Name

всі повинні стати: equipmentClassName.


1
Я зробив тест jsperf з різних методів. результати були трохи непереконливими. здається, це залежить від вхідного рядка.
yincrash


Новий тест 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();
  });
}

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

102

Якщо хтось використовує lodash , є _.camelCase()функція.

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

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

_.camelCase('__FOO_BAR__');
// → 'fooBar'

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
Це мені добре виглядає, і нічого не виглядає підозрілим, що стосується проблем із переглядачем. (Не те, що я супер-експерт чи що завгодно.)
Pointy

47
Якщо ви збираєтеся використовувати String.prototype, чому б не просто використати "this", а не надсилати параметр "str"?
yincrash

6
Для кращої сумісності браузера використовуйте це замість str (і видаліть параметр з виклику функції)
João Paulo Motta

2
Вам просто потрібно використовувати, this.valueOf()а не проходити str. Як варіант (як у моєму випадку), так this.toLowerCase()як мої рядки вводу були у ВСІХ КАПС, у яких не горбові частини були заміщені належним чином. Використання просто 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('');
}

Це великі регістри, а не верблюди.
nikk wong

2
Справа верблюда є першим символом кожного слова з великої літери, і toCamelCaseфункція саме це робить.
ismnoiet

2
Ви думаєте про PascalCase . CamelCase може бути верхній або нижній регістр. У цьому контексті часто можна уникнути плутанини.
Коді

1
Дякуємо @Kody, @ cchamberlain за ваш конструктивний коментар, перегляньте оновлену версію.
ismnoiet

5
+1, щоб не використовувати регулярні вирази, навіть якщо запитання вимагає рішення з їх використанням. Це набагато чіткіше рішення, а також явний виграш для продуктивності (адже обробка складних регулярних виразів є набагато складнішим завданням, ніж просто ітерація через купу струн та об'єднання бітів їх разом). Дивіться jsperf.com/camel-casing-regexp-or-character-manipulation/1, де я взяв кілька прикладів разом із цим (а також моє власне скромне вдосконалення його для продуктивності, хоча я, мабуть, вважаю за краще це версія для ясності в більшості випадків).
Жуль

40

Щоб отримати з Амель 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


3
Найкраща відповідь тут - чиста і лаконічна.
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-name-product, .data-product-опис, .product-container__action - ціна, .photo-placeholder__photo
Ashwani Shukla

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

Якщо 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 можуть бути або не бути швидшими.


В середньому в 5 разів швидше, якщо вам потрібно лише 1 слово jsbin.com/wuvagenoka/edit?html,js,output
Omu

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"

як щодо імен, як Жан-П'єр?
Макс Олександр Ганна


5

lodash може зробити трюк точно і добре:

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

Хоча це lodashможе бути "велика" бібліотека (~ 4 кБ), вона містить безліч функцій, для яких зазвичай можна використовувати фрагмент або створити самостійно.


є модулі npm з кожною окремою функцією lodashfunction, тому вам не потрібно імпортувати всю "велику" бібліотеку: 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, просто додайте початковий порожній рядок ,'')до методу зменшення.


3

слідуючи читаному підходу @ Скотта, трохи тонкої настройки

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

3

невелика зміна відповіді Скотта:

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

тепер він замінює також "-" і "_".


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. У цьому випадку немає чітко визначеної конвенції, але деякі інші запитання про stackoverflow пропонують розділити числа підкресленням.

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

(Я додав це як пакет 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`);
});

Відмінна робота, дякую. Обробляє набагато більше сценаріїв порівняно з іншими елементарними відповідями.
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;
}

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
Одиничні параметри символів все ще трохи злісні з точки зору читабельності
danwellman

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

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

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

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"

Спасибі за це, але, як видається, бродячий "в .replace(/_/g", " ")тому , що помилки компіляції причини?
Crashalot

1
const toCamelCase = str =>
  str
    .replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase())
    .replace(/^\w/, c => c.toLowerCase());

0

EDIT : Зараз працюю в IE8 без змін.

EDIT : Я був у меншості щодо того, що насправді є 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"

У функціях: Ви помітите, що в цих функціях заміна замінює будь-який не aз пробілом проти порожнього рядка. Це для створення меж слів для написання великих літер. "привіт-МОЙ # світ" -> "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('');

Гарного дня. :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.