「camelCase」を「Camel Case」に変換する方法は?


174

私はJavaScript正規表現コマンドを取得して、次のようなものに"thisString"変換しようとしています"This String"が、最も近いのは文字を置き換えることで、"Thi String"またはのようなものになり"This tring"ます。何か案は?

文字を大文字にするという単純さを処理できることを明確にするために、私はRegExほど強くはなく、分割は問題を抱え"somethingLikeThis""something Like This"いるところです。



6
これはどのようにそれの複製です。文字列の最初の文字を大文字にするだけですが、私がやりたいことに近いものはありません。
ウィザードは

うーん、質問のまとまりではありませんが、結果は同じかもしれません。それとも、あなたがやりたかったことではありませんか?もっと詳しく?
superfro

正規表現の実践については、RegExrまたはExpressoをテストして、SOのすべての正規表現の質問を見て、それらに回答することをお勧めします。正規表現は世界で最も単純なものではありませんが、正規表現が混乱している場合は、YOUを分割して分割して作業することを覚えておいてください。
josh.trow 2010年

回答:


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 2011

3
また追加:すべてをまとめる頭字語をまとめたい場合は、最初の正規表現を "/([AZ] [az])/"に変更できます
jackfrster

2
「これ」->「これ」(不要な接頭辞スペース)。多分それを次のように変更します: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() );に変換さuserIDUser ID、さらに変換さuserIDFieldれますUser ID Field
Eugene Mala

87

私はこれに、特にxmlHTTPRequestのように大文字のシーケンスを処理することに興味がありませんでした。リストされた関数は「Xml HTTPリクエスト」または「Xml HTTPRequest」を生成し、私のものは「Xml HTTPリクエスト」を生成します。

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

String.prototype版もあります要旨に


:同じことが2呼び出しを置き換えるで達成することができますstr.replace(/((?<!^)[A-Z](?![A-Z]))(?=\S)/g, ' $1').replace(/^./, s => s.toUpperCase() )
ユージン・マラ

22

これは、正規表現先読み(ライブデモ)を使用して簡潔に行うことができます。

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

(私はg(グローバル)フラグが必要だと思いましたが、奇妙なことに、これはこの特定のケースではありません。)

先読みを使用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しません。キャメルなしの場合、2番目の関数が失敗します。(例: 'id')
痴呆

16

単純なキャメルケースだけでなく、連続した大文字も処理できるはずです。

例:someVariable => someVariable、ただしABCCode!= ABCコード。

以下の正規表現はあなたの例で機能しますが、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


4

数値も処理するソリューション:

function capSplit(str){
   return str.replace
      ( /(^[a-z]+)|[0-9]+|[A-Z][a-z]+|[A-Z]+(?=[A-Z][a-z]|[0-9])/g
      , function(match, first){
          if (first) match = match[0].toUpperCase() + match.substr(1);
          return match + ' ';
          }
       )
   }

ここでテスト[JSFiddle、ライブラリなし。IEを試していない]; かなり安定しているはずです。


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行にループで適用し、大文字で始まるすべての行の前にそれらのスペースを取得しました
Dominik 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.