web-dev-qa-db-ja.com

camelCaseTextを文ケーステキストに変換します

JavaScriptで「helloThere」または「HelloThere」などの文字列を「Hello There」に変換するにはどうすればよいですか?

109
HyderA
var text = 'helloThereMister';
var result = text.replace( /([A-Z])/g, " $1" );
var finalResult = result.charAt(0).toUpperCase() + result.slice(1); // capitalize the first letter - as an example.

" $1"のスペースに注意してください。

編集:最初の文字の大文字化の例を追加しました。もちろん、最初の文字がすでに大文字の場合-削除するための予備スペースがあります。

134
ZenMaster

または、 lodash を使用します。

lodash.startCase(str);

例:

_.startCase('helloThere');
// ➜ 'Hello There'

Lodashは、多くの日常的なjsタスクへのショートカットを提供する優れたライブラリです。camelCasekebabCaseなど、他にも多くの類似した文字列操作関数があります。

79
Wtower

私は同様の問題を抱えており、このように対処しました:

stringValue.replace(/([A-Z]+)*([A-Z][a-z])/g, "$1 $2")

より堅牢なソリューションの場合:

stringValue.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1")

http://jsfiddle.net/PeYYQ/

入力:

 helloThere 
 HelloThere 
 ILoveTheUSA
 iLoveTheUSA

出力:

 hello There 
 Hello There 
 I Love The USA
 i Love The USA
45
James Khoury

副作用のない例。

function camel2title(camelCase) {
  // no side-effects
  return camelCase
    // inject space before the upper case letters
    .replace(/([A-Z])/g, function(match) {
       return " " + match;
    })
    // replace first char with upper case
    .replace(/^./, function(match) {
      return match.toUpperCase();
    });
}

ES6で

const camel2title = (camelCase) => camelCase
  .replace(/([A-Z])/g, (match) => ` ${match}`)
  .replace(/^./, (match) => match.toUpperCase());
24
renevanderark

キャメルケースからタイトルケースへの関数をテストするために見つけた最高の文字列は、このばかげた無意味な例で、多くのEdgeケースをテストします。 私の知る限り、以前に投稿された関数はどれもこれを正しく処理しません

ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D

これは次のように変換する必要があります。

あなたのGEDを時間内に取得するには26 ABCについての歌は本質ですが、ABC 26時間を含む部屋26Aのユーザー456の個人IDカードはC3POまたはR2D2または2R2Dの123ほど簡単ではありません

上記のようなケース(および以前の回答の多くよりも多くのケース)を処理する単純な関数だけが必要な場合は、ここに記述します。このコードは特にエレガントでも高速でもありませんが、シンプルで理解しやすく、機能します。

オンラインで実行可能な例はこちらです http://jsfiddle.net/q5gbye2w/56/

// Take a single camel case string and convert it to a string of separate words (with spaces) at the camel-case boundaries.
// 
// E.g.:
//    ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D
//                                                  --> To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D
//    helloThere                              --> Hello There
//    HelloThere                              --> Hello There 
//    ILoveTheUSA                             --> I Love The USA
//    iLoveTheUSA                             --> I Love The USA
//    DBHostCountry                           --> DB Host Country
//    SetSlot123ToInput456                    --> Set Slot 123 To Input 456
//    ILoveTheUSANetworkInTheUSA              --> I Love The USA Network In The USA
//    Limit_IOC_Duration                      --> Limit IOC Duration
//    This_is_a_Test_of_Network123_in_12_days --> This Is A Test Of Network 123 In 12 Days
//    ASongAboutTheABCsIsFunToSing                  --> A Song About The ABCs Is Fun To Sing
//    CFDs                                    --> CFDs
//    DBSettings                              --> DB Settings
//    IWouldLove1Apple                        --> 1 Would Love 1 Apple
//    Employee22IsCool                        --> Employee 22 Is Cool
//    SubIDIn                                 --> Sub ID In
//    ConfigureCFDsImmediately                --> Configure CFDs Immediately
//    UseTakerLoginForOnBehalfOfSubIDInOrders --> Use Taker Login For On Behalf Of Sub ID In Orders
//
function camelCaseToTitleCase(in_camelCaseString) {
        var result = in_camelCaseString                         // "ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D"
            .replace(/([a-z])([A-Z][a-z])/g, "$1 $2")           // "To Get YourGEDIn TimeASong About The26ABCs IsOf The Essence ButAPersonalIDCard For User456In Room26AContainingABC26Times IsNot AsEasy As123ForC3POOrR2D2Or2R2D"
            .replace(/([A-Z][a-z])([A-Z])/g, "$1 $2")           // "To Get YourGEDIn TimeASong About The26ABCs Is Of The Essence ButAPersonalIDCard For User456In Room26AContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
            .replace(/([a-z])([A-Z]+[a-z])/g, "$1 $2")          // "To Get Your GEDIn Time ASong About The26ABCs Is Of The Essence But APersonal IDCard For User456In Room26AContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
            .replace(/([A-Z]+)([A-Z][a-z][a-z])/g, "$1 $2")     // "To Get Your GEDIn Time A Song About The26ABCs Is Of The Essence But A Personal ID Card For User456In Room26A ContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
            .replace(/([a-z]+)([A-Z0-9]+)/g, "$1 $2")           // "To Get Your GEDIn Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC26Times Is Not As Easy As 123For C3POOr R2D2Or 2R2D"
            
            // Note: the next regex includes a special case to exclude plurals of acronyms, e.g. "ABCs"
            .replace(/([A-Z]+)([A-Z][a-rt-z][a-z]*)/g, "$1 $2") // "To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC26Times Is Not As Easy As 123For C3PO Or R2D2Or 2R2D"
            .replace(/([0-9])([A-Z][a-z]+)/g, "$1 $2")          // "To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC 26Times Is Not As Easy As 123For C3PO Or R2D2Or 2R2D"  

                                                // Note: the next two regexes use {2,} instead of + to add space on phrases like Room26A and 26ABCs but not on phrases like R2D2 and C3PO"
            .replace(/([A-Z]{2,})([0-9]{2,})/g, "$1 $2")        // "To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
            .replace(/([0-9]{2,})([A-Z]{2,})/g, "$1 $2")        // "To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
            .trim();


  // capitalize the first letter
  return result.charAt(0).toUpperCase() + result.slice(1);
}

あるいは、 ユーザーBarnoが提案した のように、 SugarJS を使用することは、そのライブラリを引き込むことを気にしない場合の簡単な解決策です。ただし、上記のテスト文字列を処理するかどうかはわかりません。その入力では試していません。

11
Chris Kline

これが私のバージョンです。小文字の英字の後にくるすべてのUpperCase英字の前にスペースを追加し、必要に応じて最初の文字も大文字にします。

例えば:
thisIsCamelCase->これはキャメルケースです
このIsCamelCase->これはキャメルケースです
thisIsCamelCase123->これはCamel Case123です

  function camelCaseToTitleCase(camelCase){
    if (camelCase == null || camelCase == "") {
      return camelCase;
    }

    camelCase = camelCase.trim();
    var newText = "";
    for (var i = 0; i < camelCase.length; i++) {
      if (/[A-Z]/.test(camelCase[i])
          && i != 0
          && /[a-z]/.test(camelCase[i-1])) {
        newText += " ";
      }
      if (i == 0 && /[a-z]/.test(camelCase[i]))
      {
        newText += camelCase[i].toUpperCase();
      } else {
        newText += camelCase[i];
      }
    }

    return newText;
  }
9
asafd

わかりました、私はゲームに数年遅れていますが、私は同様の質問を持っていました、そして、私はすべての可能な入力のために1つの置換ソリューションを作りたかったです。私はこのスレッドで@ZenMasterと@ this スレッドで@Benjamin Udink ten Cateにクレジットのほとんどを与えなければなりません。コードは次のとおりです。

_var camelEdges = /([A-Z](?=[A-Z][a-z])|[^A-Z](?=[A-Z])|[a-zA-Z](?=[^a-zA-Z]))/g;
var textArray = ["lowercase",
                 "Class",
                 "MyClass",
                 "HTML",
                 "PDFLoader",
                 "AString",
                 "SimpleXMLParser",
                 "GL11Version",
                 "99Bottles",
                 "May5",
                 "BFG9000"];
var text;
var resultArray = [];
for (var i = 0; i < a.length; i++){
    text = a[i];
    text = text.replace(camelEdges,'$1 ');
    text = text.charAt(0).toUpperCase() + text.slice(1);
    resultArray.Push(text);
}
_

3つの句があり、すべて lookahead を使用して、正規表現エンジンが多くの文字を消費しないようにします。

  1. [A-Z](?=[A-Z][a-z])は、大文字に続いて小文字が続く大文字を探します。これは、米国のような頭字語を終わらせることです。
  2. [^A-Z](?=[A-Z])は、大文字が後に続く大文字以外の文字を探します。これにより、myWordのような単語と99Bottlesのような記号が終了します。
  3. [a-zA-Z](?=[^a-zA-Z])は、文字の後に非文字が続く文字を探します。これにより、BFG9000のような記号の前の単語が終了します。

この質問は私の検索結果の一番上にあったので、他の人の時間を節約できることを願っています!

7

上記の例の1つに基づいて、私はこれを思いつきました。

_const camelToTitle = (camelCase) => camelCase
  .replace(/([A-Z])/g, (match) => ` ${match}`)
  .replace(/^./, (match) => match.toUpperCase())
  .trim()
_

.trim()を使用して、最初の文字が大文字になり、余分な先行スペースが発生するEdgeのケースを処理するため、私にとってはうまくいきます。

リファレンス: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim

6
Anthony S.

次のような関数を使用できます。

function fixStr(str) {
    var out = str.replace(/^\s*/, "");  // strip leading spaces
    out = out.replace(/^[a-z]|[^\s][A-Z]/g, function(str, offset) {
        if (offset == 0) {
            return(str.toUpperCase());
        } else {
            return(str.substr(0,1) + " " + str.substr(1).toUpperCase());
        }
    });
    return(out);
}

"hello World" ==> "Hello World"
"HelloWorld" ==> "Hello World"
"FunInTheSun" ==? "Fun In The Sun"

ここに一連のテスト文字列を含むコード: http://jsfiddle.net/jfriend00/FWLuV/

ここに先頭のスペースを保持する代替バージョン: http://jsfiddle.net/jfriend00/Uy2ac/

3
jfriend00

これは私のために働いていますこれをチェックしてください

CamelcaseToWord( "MyName"); // My Nameを返します

    function CamelcaseToWord(string){
      return string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1");
    }
2
Poorna Rao

このライブラリを試してください

http://sugarjs.com/api/String/titleize

'man from the boondocks'.titleize()>"Man from the Boondocks"
'x-men: the last stand'.titleize()>"X Men: The Last Stand"
'TheManWithoutAPast'.titleize()>"The Man Without a Past"
'raiders_of_the_lost_ark'.titleize()>"Raiders of the Lost Ark"
2
Barno

これはreg exp /([a-z]|[A-Z]+)([A-Z])/gと置換"$1 $2"

ILoveTheUSADope-> I Love The USA Dope

上記の答えはどれも私にとって完璧に機能しなかったので、自分の自転車を用意する必要がありました。

function camelCaseToTitle(camelCase) {
    if (!camelCase) {
        return '';
    }

    var pascalCase = camelCase.charAt(0).toUpperCase() + camelCase.substr(1);
    return pascalCase
        .replace(/([a-z])([A-Z])/g, '$1 $2')
        .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
        .replace(/([a-z])([0-9])/gi, '$1 $2')
        .replace(/([0-9])([a-z])/gi, '$1 $2');
}

テストケース:

null => ''
'' => ''
'simpleString' => 'Simple String'
'stringWithABBREVIATIONInside => 'String With ABBREVIATION Inside'
'stringWithNumber123' => 'String With Number 123'
'complexExampleWith123ABBR890Etc' => 'Complex Example With 123 ABBR 890 Etc'
1

私は皆の答えを試しませんでしたが、私がいじくり回したいくつかの解決策は私の要件のすべてに適合しませんでした。

何かを思いつくことができました...

export const jsObjToCSSString = (o={}) =>
    Object.keys(o)
          .map(key => ({ key, value: o[key] }))
          .map(({key, value}) =>
              ({
                key: key.replace( /([A-Z])/g, "-$1").toLowerCase(),
                value
              })
          )
          .reduce(
              (css, {key, value}) => 
                  `${css} ${key}: ${value}; `.trim(), 
              '')
1
Tabbyofjudah

以下は、正規表現を使用してキャメルケース文字列を文文字列に示すリンクです。

入力

myCamelCaseSTRINGToSPLITDemo

出力

my Camel Case STRING To SPLIT Demo


これは、ラクダのケースを文のテキストに変換するための正規表現です

(?=[A-Z][a-z])|([A-Z]+)([A-Z][a-rt-z][a-z]\*)

$1 $2代替として。

正規表現の変換を表示するにはクリック

1
Rahul

入力 javaScript

出力 Java Script

   var text = 'javaScript';
    text.replace(/([a-z])([A-Z][a-z])/g, "$1 $2").charAt(0).toUpperCase()+text.slice(1).replace(/([a-z])([A-Z][a-z])/g, "$1 $2");
0
Manas