[javascript] 하이픈을 낙타 케이스로 변환 (camelCase)

정규식 (나는 가정) 또는 다른 방법으로 다음과 같은 것을 어떻게 변환 할 수 있습니까?

marker-imagemy-example-setting에게 markerImage또는 myExampleSetting.

나는 -그 hypen +1의 색인을 대문자로 변환하여 나누는 것에 대해 생각하고있었습니다 . 그러나 그것은 더러워 보였고 코드를 깨끗하게 만들 수있는 정규 표현식에 대한 도움을 원했습니다.

jQuery가 없습니다



답변

이 시도:

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

정규식은 -iin marker-image과 일치하고 만 캡처합니다 i. 그런 다음 콜백 함수에서 대문자로 대체됩니다.


답변

이것은 당신이 깨달았고 프로젝트에 포함되어 있다면 Lodash가 제공 하는 훌륭한 유틸리티 중 하나입니다 .

var str = 'my-hyphen-string';
str = _.camelCase(str);
// results in 'myHyphenString'


답변

하이픈과 다음 문자를 가져 와서 대문자의 문자 버전으로 바꿀 수 있습니다.

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


답변

내 camelCase 함수 버전은 다음과 같습니다.

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

다음과 같은 경우를 모두 처리합니다.

  • 기본적으로 밑줄과 하이픈을 모두 처리합니다 (두 번째 매개 변수로 구성 가능).
  • 유니 코드 문자가 포함 된 문자열
  • 하이픈 또는 밑줄로 끝나는 문자열
  • 연속적인 하이픈 또는 밑줄이있는 문자열

라이브 테스트 링크는 다음과 같습니다. http://jsfiddle.net/avKzf/2/

테스트 결과는 다음과 같습니다.

  • 입력 : “ab-cd-ef”, 결과 : “abCdEf”
  • 입력 : “ab-cd-ef-“, 결과 : “abCdEf”
  • 입력 : “ab-cd-ef–“, 결과 : “abCdEf”
  • 입력 : “ab-cd–ef–“, 결과 : “abCdEf”
  • 입력 : “–ab-cd–ef–“, 결과 : “AbCdEf”
  • 입력 : “–ab-cd -__- ef–“, 결과 : “AbCdEf”

구분 기호로 시작하는 문자열은 처음에 대문자로 나타납니다. 이것이 예상과 다르면 언제든지 lcfirst를 사용할 수 있습니다. 필요한 경우 내 lcfirst가 있습니다.

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


답변

이것은 RegExp나에게 비명을 지르지 않습니다 . 개인적으로 간단한 문자열 및 배열 메소드로 충분할 때 정규 표현식을 피하려고합니다.

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


답변

여기에 몇 가지 답변을 결합하고 문자열에서 메소드를 만드는 또 다른 옵션이 있습니다.

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

이런 식으로 사용 :

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


답변

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