“camelCase”를“Camel Case”로 변환하는 방법?


174

내가 좋아하는 뭔가를 설정하는 자바 스크립트 정규식 명령을 얻기 위해 노력했습니다 "thisString""This String"내가 가까이서 보는이 같은 결과 편지를 대체하지만, "Thi String"또는 "This tring". 어떤 아이디어?

문자를 대문자로 표기하는 단순성을 처리 할 수 ​​있음을 분명히하기 위해 RegEx만큼 강력하지 않으며 문제가있는 곳 "somethingLikeThis"으로 나눕니다 "something Like This".



6
이것이 어떻게 복제품입니까? 모든 것은 문자열에서 첫 번째 문자를 대문자로 바꾸는 것입니다.
마법사는

흠 그것은 질문의 속박이 아니지만 결과는 동일 할 수 있습니다. 아니면 당신이하고 싶은 것이 아니십니까? 더 정교하게?
superfro November

정규식 연습을 위해 RegExr 또는 Expresso를 테스트하고 SO에 대한 모든 정규식 질문을보고 답변하려고합니다. 정규식은 세계에서 가장 간단한 것이 아니지만 정규식이 혼란 스러우면 분할하여 조각으로 작업한다는 것을 기억하십시오.
josh.trow

답변:


399
"thisStringIsGood"
    // insert a space before all caps
    .replace(/([A-Z])/g, ' $1')
    // uppercase the first character
    .replace(/^./, function(str){ return str.toUpperCase(); })

표시

This String Is Good


1
좋은 사람이야. Bobince의 조언을 기억하십시오 : stackoverflow.com/questions/1732348/…
josh.trow

이것이 IE와 호환됩니까? IETester7에서 시도했지만 오류가 발생했습니다.
strongriley

3
또한 추가 : 함께 유지하려는 모든 대문자 약어가있는 경우 첫 번째 정규 표현식을 "/ ([AZ] [az]) /"로 변경할 수 있습니다.
jackfrster

2
"This"-> "This"(원치 않는 접두사 공간). 다음과 같이 변경하십시오. str.slice (0, 1) .toUpperCase () + str.slice (1) .replace (/ ([AZ]) / g, '$ 1')
Mark Vayngrib

1
@ColdCerberus 다음을 사용할 수 있습니다 : str.replace(/((?<!^)[A-Z](?![A-Z]))(?=\S)/g, ' $1').replace(/^./, s => s.toUpperCase() );로 변환 userID하고 User ID심지어 변환 userIDField할 수도 있습니다User ID Field
Eugene Mala

87

특히 xmlHTTPRequest와 같은 일련의 대문자를 처리하는 데 유휴 관심이있었습니다. 나열된 함수는 "Xml HTTP Request"또는 "Xml HTTPRequest"를 생성하고, "Xml HTTP Request"를 생성합니다.

function unCamelCase (str){
    return str
        // insert a space between lower & upper
        .replace(/([a-z])([A-Z])/g, '$1 $2')
        // space before last upper in a sequence followed by lower
        .replace(/\b([A-Z]+)([A-Z])([a-z])/, '$1 $2$3')
        // uppercase the first character
        .replace(/^./, function(str){ return str.toUpperCase(); })
}

gist 에는 String.prototype 버전도 있습니다 .


같은 2 전화를 대체 달성 할 수있다 :str.replace(/((?<!^)[A-Z](?![A-Z]))(?=\S)/g, ' $1').replace(/^./, s => s.toUpperCase() )
유진 말라에게

22

이것은 정규식 lookahead ( live demo ) 로 간결하게 수행 할 수 있습니다 .

function splitCamelCaseToString(s) {
    return s.split(/(?=[A-Z])/).join(' ');
}

( g(전역) 플래그가 필요 하다고 생각 했지만 이상하게 도이 특별한 경우는 아닙니다.)

lookahead를 with와 함께 사용 split하면 일치하는 대문자가 사용되지 않고 UpperCamelCase가 처리해야하는 경우 선행 공백을 처리하지 않습니다. 각각의 첫 글자를 대문자로 사용하려면 다음을 사용할 수 있습니다.

function splitCamelCaseToString(s) {
    return s.split(/(?=[A-Z])/).map(function(p) {
        return p.charAt(0).toUpperCase() + p.slice(1);
    }).join(' ');
}

map배열 방법은 ES5 기능입니다,하지만 당신은 여전히 함께 이전 버전의 브라우저에서 사용할 수 있습니다 MDC에서 일부 코드 . 또는 for루프를 사용하여 배열 요소를 반복 할 수 있습니다 .


첫 번째 함수는이를 분할하지만 첫 번째 단어를 PascalCase하지 않습니다. camelCased가없는 경우 두 번째 기능이 실패합니다. (예 : 'id')
Dementic

16

나는 이것이 간단한 낙타 케이스뿐만 아니라 연속 대문자를 처리 할 수 ​​있어야한다고 생각합니다.

예 : someVariable => someVariable이지만 ABCCode! = ABC Code입니다.

아래 정규식은 예제에서 작동하지만 camcelCase에서 약어를 나타내는 일반적인 예제입니다.

"somethingLikeThis"
    .replace(/([a-z])([A-Z])/g, '$1 $2')
    .replace(/([A-Z])([a-z])/g, ' $1$2')
    .replace(/\ +/g, ' ') => "something Like This"

"someVariableWithABCCode"
    .replace(/([a-z])([A-Z])/g, '$1 $2')
    .replace(/([A-Z])([a-z])/g, ' $1$2')
    .replace(/\ +/g, ' ') => "some Variable With ABC Code"

첫 번째 문자를 대문자로 바꾸려면 위와 같이 조정할 수도 있습니다.


10
function spacecamel(s){
    return s.replace(/([a-z])([A-Z])/g, '$1 $2');
}

spacecamel ( 'somethingLikeThis')

// 반환 값 : 이와 같은


1
좋은 것! 이것은 내가 나누고 싶었던 것과 정확히 같습니다. 예 : DiscoveryChannel과 HBO 다른 답변은 Discovery Channel과 HBO를 주었지만 HBO는 그대로 감사합니다.
AJS



0

구형 브라우저에 신경 쓰지 않거나 폴백 감소 기능을 사용하지 않아도되는 경우 'xmlHTTPRequest'와 같은 문자열도 분할 할 수 있지만 'XMLHTTPRequest'와 같은 문자열은 분할 할 수 없습니다.

function splitCamelCase(str) {
        return str.split(/(?=[A-Z])/)
                  .reduce(function(p, c, i) {
                    if (c.length === 1) {
                        if (i === 0) {
                            p.push(c);
                        } else {
                            var last = p.pop(), ending = last.slice(-1);
                            if (ending === ending.toLowerCase()) {
                                p.push(last);
                                p.push(c);
                            } else {
                                p.push(last + c);
                            }
                        }
                    } else {
                        p.push(c.charAt(0).toUpperCase() + c.slice(1));
                    }
                    return p;
                  }, [])
                  .join(' ');
}

0

내 버전

function camelToSpace (txt) {
  return txt
    .replace(/([^A-Z]*)([A-Z]*)([A-Z])([^A-Z]*)/g, '$1 $2 $3$4')
    .replace(/ +/g, ' ')
}
camelToSpace("camelToSpaceWithTLAStuff") //=> "camel To Space With TLA Stuff"

나는 모든 라인의 앞에 그 공간을 3000 선에 루프에서이 기능을 적용하고있어 그 자본이 시작
도미니크 Domanski

0

이 솔루션을 사용해보십시오-

var value = "myCamelCaseText";
var newStr = '';
for (var i = 0; i < value.length; i++) {
  if (value.charAt(i) === value.charAt(i).toUpperCase()) {
    newStr = newStr + ' ' + value.charAt(i)
  } else {
    (i == 0) ? (newStr += value.charAt(i).toUpperCase()) : (newStr += value.charAt(i));
  }
}
return newStr;

-5

정규 표현식은 아니지만 다음과 같이 평범하고 오래된 기술을 아는 것이 유용합니다.

var origString = "thisString";
var newString = origString.charAt(0).toUpperCase() + origString.substring(1);

5
아니오, 질문은 "thisString"에서 "This String"(공백 포함)이 아니라 "ThisString"이 아닙니다.
Pete Kirkham

@rob "this"와 "String"사이에 공백을 어떻게 넣습니까?
ThunderBird
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.