Kısa çizgileri deve harfine dönüştürme (camelCase)


147

Normal ifade (varsayıyorum) veya başka bir yöntemle, aşağıdaki gibi şeyleri nasıl dönüştürebilirim:

marker-imageveya my-example-settingiçin markerImageveya myExampleSetting.

Sadece bölmeyi düşünüyordum ve -ardından hipen + 1'in dizinini büyük harfe dönüştür. Ancak oldukça kirli görünüyor ve normal ifadeyle kodu daha temiz hale getirebilecek bir miktar yardım umuyordu.

JQuery yok ...



7
aslında öyle, ama aradım ve muhtemelen belirsiz ad nedeniyle bulamadım. İnsanların cevabı bulabilmesi için bunu açık tutmanızı öneririm. "RegExp $ 1'den büyük harfe" ... IMO normal ifadesini bilmedikçe kimse onu bulamaz
Oscar Godson

Bu kolayca düzeltilebilirdi. Başlığı yeni düzenledim
mplungjan

Yani çözümleri kesip yapıştırmak bana kabul edilen bir cevabı kazandırırdı: |
mplungjan

tam tersini yapmanın bir yolu var mı?
Pavan

Yanıtlar:


264

Bunu dene:

var camelCased = myString.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); });

Düzenli ifade eşleşir -iin marker-imageve yakalama sadece i. Bu, daha sonra geri arama işlevinde büyük harfle yazılır ve değiştirilir.


54
Bilginize, işte tam tersi:myString.replace(/([a-z][A-Z])/g, function (g) { return g[0] + '-' + g[1].toLowerCase() });
Cyril N.

Sanırım parametrenin "m" olarak yeniden adlandırılması gerektiğini düşünüyorum, "eşleşme" gibi. Hızlı bir şekilde şöyle bir şey yazılabilir: myString.replace(/-([a-z])/i, function (i) { return i[1].toUpperCase() });
programatlar

8
İşaret ekleyerek normal ifadenizi daha sağlam hale getirmek iyi bir fikir olabilir i. Bu olmadan, kalıbınız "büyük harfli Parçalar" ı kaçırır ("büyük harfli Parçalar" olarak değiştirilmez). Ayrıca, kişisel olarak birden fazla parametrenin geliştirilmiş okunabilirliğini tercih ediyorum, ancak bu açıkça bir stil meselesi. Sonuçta, ben de giderdim .replace( /-([a-z])/gi, function ( $0, $1 ) { return $1.toUpperCase(); } );.
hashchange

Buna ek olarak, boşlukla ayrılmış kelimeleri de var camelCased = myString.replace(/(-+|\s+)\w/g, function (g) { return g[1].toUpperCase(); });
devrelemek

@ wolfram77, Normal ifadeye birden çok çizgi / boşluk karakteri eklersiniz, ardından eşleşmenin ikinci karakterini büyük harfle yazarsınız, yani ikinci karakter bir boşluk veya tireyse, büyük harfle yazılan karakterdir. Şöyle yapsak: var camelCased = myString.replace(/(-+|\s+)\w/g, function (g) { return g[g.length - 1].toUpperCase(); });?
trysis


14

Hipeni ve bir sonraki karakteri alabilir ve karakterin büyük harfli versiyonuyla değiştirebilirsiniz:

var str="marker-image-test";
str.replace(/-([a-z])/g, function (m, w) {
    return w.toUpperCase();
});

3
Güzel - Bu yönteme gittim ama ES6 onu >> str.replace (/ - ([az]) / g, (x, up) => up.toUpperCase ())
ConorLuddy

13

İşte camelCase işlevi sürümüm:

var camelCase = (function () {
    var DEFAULT_REGEX = /[-_]+(.)?/g;

    function toUpper(match, group1) {
        return group1 ? group1.toUpperCase() : '';
    }
    return function (str, delimiters) {
        return str.replace(delimiters ? new RegExp('[' + delimiters + ']+(.)?', 'g') : DEFAULT_REGEX, toUpper);
    };
})();

Aşağıdaki tüm uç durumları ele alır:

  • varsayılan olarak hem alt çizgileri hem de kısa çizgileri dikkate alır (ikinci parametre ile yapılandırılabilir)
  • unicode karakterli dizge
  • tire veya alt çizgi ile biten dize
  • ardışık kısa çizgi veya alt çizgi içeren dize

İşte canlı testlere bir bağlantı: http://jsfiddle.net/avKzf/2/

İşte testlerin sonuçları:

  • girdi: "ab-cd-ef", sonuç: "abCdEf"
  • girdi: "ab-cd-ef-", sonuç: "abCdEf"
  • girdi: "ab-cd-ef--", sonuç: "abCdEf"
  • girdi: "ab-cd - ef--", sonuç: "abCdEf"
  • girdi: "--ab-cd - ef--", sonuç: "AbCdEf"
  • girdi: "--ab-cd -__- ef--", sonuç: "AbCdEf"

Sınırlayıcılarla başlayan dizelerin başında büyük harfle sonuçlanacağına dikkat edin. Beklediğiniz bu değilse, her zaman lcfirst kullanabilirsiniz. İhtiyacınız olursa ilk lcfirim:

function lcfirst(str) {
    return str && str.charAt(0).toLowerCase() + str.substring(1);
}

4

Bu RegExpbana bir çığlık atmıyor . Kişisel olarak, basit dizge ve dizi yöntemleri yeterli olduğunda normal ifadelerden kaçınmaya çalışıyorum:

let upFirst = word => 
  word[0].toUpperCase() + word.toLowerCase().slice(1)

let camelize = text => {
  let words = text.split(/[-_]/g) // ok one simple regexp.
  return words[0].toLowerCase() + words.slice(1).map(upFirst)
}

camelize('marker-image') // markerImage

1

Burada bir çift yanıtı birleştiren ve onu bir dizge üzerinde yöntem yapan başka bir seçenek:

if (typeof String.prototype.toCamel !== 'function') {
  String.prototype.toCamel = function(){
    return this.replace(/[-_]([a-z])/g, function (g) { return g[1].toUpperCase(); })
  };
}

Bunun gibi kullanıldı:

'quick_brown'.toCamel(); // quickBrown
'quick-brown'.toCamel(); // quickBrown

1
// Turn the dash separated variable name into camelCase.
str = str.replace(/\b-([a-z])/g, (_, char) => char.toUpperCase());

1

NPM'den devetüyü kullanabilirsiniz .

npm install --save camelcase

const camelCase = require('camelcase');
camelCase('marker-image'); // => 'markerImage';
camelCase('my-example-setting'); // => 'myExampleSetting';

0

Başka bir çekim.

Ne zaman kullanılır ...

var string = "hyphen-delimited-to-camel-case"
or
var string = "snake_case_to_camel_case"


function toCamelCase( string ){
  return string.toLowerCase().replace(/(_|-)([a-z])/g, toUpperCase );
}

function toUpperCase( string ){
  return string[1].toUpperCase();
}

Output: hyphenDelimitedToCamelCase

0

o görev için özyineleme ile indexOf kullanmak da mümkündür.

input some-foo_sd_dsd-weqe
output someFooSdDsdWeqe

karşılaştırma ::: iki farklı komut dosyası için yürütme süresini ölçün:

$ node camelCased.js
someFooSdDsdWeqe
test1: 2.986ms
someFooSdDsdWeqe
test2: 0.231ms

kod:

console.time('test1');
function camelCased (str) {

        function check(symb){

            let idxOf = str.indexOf(symb);
            if (idxOf === -1) {
                return str;
            }

            let letter = str[idxOf+1].toUpperCase();
            str = str.replace(str.substring(idxOf+1,idxOf+2), '');
            str = str.split(symb).join(idxOf !== -1 ? letter : '');

            return camelCased(str);
        }       

        return check('_') && check('-');

    }

console.log(camelCased ('some-foo_sd_dsd-weqe'));
console.timeEnd('test1');



console.time('test2');

    function camelCased (myString){
     return myString.replace(/(-|\_)([a-z])/g, function (g) { return  g[1].toUpperCase(); });
   }


console.log(camelCased ('some-foo_sd_dsd-weqe'));
console.timeEnd('test2');

0

Sadece işaretli, döngü için ve Regex içermeyen bir sürüm:

function camelCase(dash) { 

  var camel = false;
  var str = dash;
  var camelString = '';

  for(var i = 0; i < str.length; i++){
    if(str.charAt(i) === '-'){
      camel = true;

    } else if(camel) {
      camelString += str.charAt(i).toUpperCase();
      camel = false;
    } else {
      camelString += str.charAt(i);
    }
  } 
  return camelString;
}

0

İşte benim uygulamam (sadece elleri kirletmek için)

/**
 * kebab-case to UpperCamelCase
 * @param {String} string
 * @return {String}
 */
function toUpperCamelCase(string) {
  return string
    .toLowerCase()
    .split('-')
    .map(it => it.charAt(0).toUpperCase() + it.substr(1))
    .join('');
}

0

Dizinizde sayılara izin verirseniz bunu kullanın .

Açıkçası, bir sayı ile başlayan kısımlar büyük harfle yazılmayacaktır, ancak bu bazı durumlarda yararlı olabilir.

function fromHyphenToCamelCase(str) {
  return str.replace(/-([a-z0-9])/g, (g) => g[1].toUpperCase())
}

function fromHyphenToCamelCase(str) {
  return str.replace(/-([a-z0-9])/g, (g) => g[1].toUpperCase())
}

const str1 = "category-123";
const str2 = "111-222";
const str3 = "a1a-b2b";
const str4 = "aaa-2bb";

console.log(`${str1} => ${fromHyphenToCamelCase(str1)}`);
console.log(`${str2} => ${fromHyphenToCamelCase(str2)}`);
console.log(`${str3} => ${fromHyphenToCamelCase(str3)}`);
console.log(`${str4} => ${fromHyphenToCamelCase(str4)}`);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.