文字列をキャメルケースに変換する


171

javascript regexを使用して文字列をキャメルケースに変換するにはどうすればよいですか?

EquipmentClass nameまたは Equipment classNameまたはequipment class nameまたはEquipment Class Name

すべてが次のようになりますequipmentClassName


1
さまざまな方法のjsperfテストを行いました。結果はわずかに決定的ではありませんでした。入力文字列に依存しているようです。
yincrash '26


テストするいくつかの異なる文字列と幅広い実装を備えた新しいjsperfテスト:jsperf.com/camel-casing-regexp-or-character-manipulation/1-これにより、平均的なケースでは、この質問のアスカーのフレージング、正規表現ではありません、あなたが欲しいもの。それらは理解するのがはるかに難しいだけでなく、(少なくとも現在のバージョンのChromeでは)実行に約2倍の時間がかかります。
ジュール、

回答:


237

コードを見ると、2つの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"

編集:または、1回の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!" 悲しい顔。私は自分で試してみますが、別の交換品を追加するのではないかと恐れています。
Orwellophile、

2
...非アルファは、ケースには影響しないはずなので、私は必ずそれがより良好に行うことができないんだけどreturn this.replace(/[^a-z ]/ig, '').replace(/(?:^\w|[A-Z]|\b\w|\s+)/g,...
Orwellophile

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 2017年

2
これは例で尋ねられたケースではありませんでしたが、おそらく表示される別の一般的な入力は、このメソッドが失敗する「機器クラス名」です。
Alexander Tsepkov 2017

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'

2
この答えは間違いなくさらに上に表示されます。Lodashは、異なるケース間で文字列を変換するための完全なセットを提供します。
btx 2018

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
それは私には問題なく見え、クロスブラウザの問題に関しては何も疑わしく見えません。(私がスーパーエキスパートであるというわけではありません。)
10:23のポインティ

47
String.prototypeを使用する場合は、「str」パラメーターを送信する代わりに「this」を使用しないのはなぜですか?
yincrash '26

6
より良いブラウザの互換性ではなく、STRの本を使用(および関数呼び出しからパラメータを削除)してくださいについて
ジョアン・パウロモッタ

2
this.valueOf()を渡す代わりに使用する必要があるだけですstr。別の方法として(私の場合のように)this.toLowerCase()入力文字列はすべての大文字であり、こぶ以外の部分が適切に小文字化されていませんでした。を使用thisすると、実際には文字の配列である文字列オブジェクト自体が返されるため、上記のTypeErrorになります。
Draco18sは、2015

2
これは必要なものの正反対を返します。これはsTRINGを返します。
Awol

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 2016年

2
あなたはPascalCaseを考えていますCamelCaseは大文字でも小文字でもかまいません。この文脈では、混乱を避けるために、多くの場合小文字です。
Kody

1
建設的なコメントを@Kody、@ cchamberlainに感謝します。更新されたバージョンをチェックアウトしてください。
ismnoiet

5
質問が正規表現を使用する解決策を求めた場合でも、正規表現を使用しない場合は+1 。これははるかに明確なソリューションであり、パフォーマンスにとっても明らかに有利です(複雑な正規表現を処理することは、一連の文字列を繰り返し処理してそれらのビットを結合するよりもはるかに難しいタスクであるためです)。jsperf.com/camel-casing-regexp-or-character-manipulation/1を参照してくださいここでは、これと一緒にいくつかの例を取り上げました(また、パフォーマンスのために独自の適度な改善を加えていますが、おそらくこれを好みます)ほとんどの場合、わかりやすくするためにバージョンを示しています)。
ジュール・

41

取得するには、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 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


4
ここでの最良の答えは、簡潔で簡潔なものです。
codeepic

5
ES6がすべてを小文字にしてくれました
Cバウアー

@Luisはhttps://stackoverflow.com/posts/52551910/revisionsES6を追加しましたが、テストしていません。確認して更新します。
smilyface


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

.data-product-name、.data-product-description、.product-container__actions--price、.photo-placeholder__photoのような文字列に2,3を超えるハイフンまたはアンダースコアがあるとどうなるか
Ashwani Shukla

1
@AshwaniShukla複数のハイフンやアンダースコアを処理するには、文字グループに乗数+)を追加する必要があります。例:/^([A-Z])|[\s-_]+(\w)/g
Fredric

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

camelCase文字列に対するJavaScript関数を見つけようとしていて、特殊文字が削除されるようにしたいと思っていました(上記の回答の一部が何をしているか理解できませんでした)。これは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 );
}

パフォーマンステストはまだ行っていません。正規表現バージョンの方が速い場合とそうでない場合があります。


あなただけの1ワードが必要な場合は5倍の倍高速平均で、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"

Jean-Pierreのような名前はどうですか?
Max Alexander Hanna

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「大」のライブラリ(〜4kBの)とすることができる、それはあなたが通常のためのスニペットを使用するか、または自分自身を構築したいという多くの機能が含まれています。


それぞれのlodash関数にnpmモジュールがあるため、すべての「大きな」ライブラリをインポートする必要はありません。npmjs.com
package

5

作業を行うライナーは次のとおりです。

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

RegExpで提供される文字のリストに基づいて小文字の文字列を分割し[.\-_\s]([]!内にさらに追加する)、単語の配列を返します。次に、文字列の配列を、最初の文字を大文字にした1つの単語の連結文字列に減らします。reduceには初期値がないため、2番目の単語で始まる最初の文字が大文字で始まります。

PascalCaseが必要な場合は,'')、reduceメソッドに最初の空の文字列を追加します。


3

@Scottの読みやすいアプローチに従って、微調整を少し

//任意の文字列をキャメルケースに変換します
var toCamelCase = function(str){
  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()

現在は「-」と「_」も置き換えられています。


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


この例は、replaceメソッドで2つの別の関数を使用する方法を示しています。
Chang Hoon Lee

3

この質問にはさらに別の答えが必要だったので...

以前の解決策のいくつかを試しましたが、それらのすべてに何らかの欠陥がありました。句読点を削除しなかった人もいます。いくつかは、数字のケースを処理しませんでした。複数の句読点を連続して処理しないものもあります。

それらのどれものような文字列を処理しませんでしたa1 2b。この場合に明示的に定義された規則はありませんが、他のいくつかのスタックオーバーフローの質問では、数字をアンダースコアで区切ることを提案しました。

これが最もパフォーマンスの高い答えであるとは思えません(1つまたは2つではなく3つの正規表現が文字列を通過します)。ただし、考えられるすべてのテストに合格しています。正直なところ、キャメルケースの変換が非常に多く行われていて、パフォーマンスが問題になるようなケースは想像もできません。

(これをnpmパッケージとして追加しました。キャメルケースの代わりにパスカルケースを返すオプションのブールパラメータも含まれています。)

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 '14 / 02/14

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

私はこれが古い答えであることを知っていますが、これは空白と_(ロダッシュ)の両方を処理します

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

編集:IE8で変更なしで動作するようになりました。

編集:私はキャメルケースが実際に何であるかについて少数派でした(先頭の文字の小文字と大文字の比較)。コミュニティ全体では、先頭の小文字はラクダの大文字であり、先頭の大文字はパスカルの大文字であると考えています。正規表現パターンのみを使用する2つの関数を作成しました。:)したがって、私たちは統一された語彙を使用しています。


どちらの場合でも、必要なのは単一の正規表現だけです。

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が空の文字列ではなくスペースに置き換えられます。これは、大文字の単語境界を作成するためです。"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
}

ノート:

  • 読みやすくするために、大文字と小文字を区別しないフラグ(i)をパターン(/ [^ AZ] / ig)に追加するのではなく、A-Za-zを残しました。
  • これはIE8で動作します(srsly、もうIE8を使用します)。IE11、IE10、IE9、IE8、IE7、IE5でテストした(F12)開発ツールを使用します。すべてのドキュメントモードで機能します。
  • これにより、空白の有無にかかわらず、文字列の最初の文字が正しく大文字になります。

楽しい


最初の文字はまだ大文字です?
デイブクラーク

はい。それが開始するためにそれが低いか高い場合には、それは大文字になります。
ジョージョンストン

2
それはキャメルケースではありません-そしてOPが要求したものと一致しませんか?
デイブクラーク

うまくいけば、この編集はOPが探していた結果を提供します。私の人生では、反対票が何のためにあるのか私にはわかりませんでした。OPに応答しない...それで十分です。:)
ジョージョンストン

1
「パスカルケース」はキャメルケースと呼ばれる、リーディングキャピタルです。
テッドモーリン

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.prototypesは読み取り専用であるため、String.prototype.toCamelCase()を使用しないでください。ほとんどのjsコンパイラがこの警告を表示します。

私と同様に、文字列には常に1つのスペースしか含まれないことを知っている人は、より簡単な方法を使用できます。

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

良い一日を過ごしてください。:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.