JavaScriptで文字列をタイトルケースに変換


549

文字列をタイトルケースに変換する簡単な方法はありますか?例えばにjohn smithなりJohn Smithます。John Resigのソリューションのような複雑なものを探しているのではなく、(おそらく)ある種の1ライナーまたは2ライナーを探しています。


さまざまな方法がありますが、パフォーマンス統計はありますか?
theAnubhav

この短い回答chechくださいstackoverflow.com/a/57689168/10373693 私はそれはあなたが探している答えことを願っています。
Abhishek Kumar

回答:


740

これを試して:

    function toTitleCase(str) {
        return str.replace(
            /\w\S*/g,
            function(txt) {
                return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
            }
        );
    }
<form>
Input:
<br /><textarea name="input" onchange="form.output.value=toTitleCase(this.value)"  onkeyup="form.output.value=toTitleCase(this.value)"></textarea>
<br />Output:
<br /><textarea name="output" readonly onclick="select(this)"></textarea>
</form>


14
誰かが説明してもらえますか、なぜ\w\S*\w+または代わりに、または\w*たとえば使用されますか?なぜスペース以外のものを含める必要があるのか​​、そしてJim-BobJim-bobに変更する理由はわかりません。
martinczerwi 2013年

5
@martinCzerwi \w\S*Jim-bob私たちの側で問題を引き起こしました。これを使用して\w*解決しました。
Bouke、2013

14
/([^\W_]+[^\s-]*) */gJim-Bob問題を解決します。例:jim-bob --> Jim-Bob
recursion.ninja

15
それjim-bob --> Jim-Bobがあなたの望みであるなら、あなたはおそらくすべきです/\b\w+/g。例:str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
vol7ron 2014年

3
\w\S*代わりに使用されている\w+\w*のような言葉がなるようDon'tに変更されませんDon'Tが、他のように指摘している\w\S*ハイフネーションされた単語と原因の問題を。
doubleDown 2017

198

もう少しエレガントな方法で、Greg Deanの関数を適応させます。

String.prototype.toProperCase = function () {
    return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
};

次のように呼び出します:

"pascal".toProperCase();

3
名前にダッシュが含まれるユーザーがいて、と入力したJo-Ann Smith場合、このコードはそれらをに変換しますJo-ann Smith(の小文字aに注意してくださいAnn)。
dbau

18
@daniellmbなぜ彼はStringプロトタイプを変更すべきではないのですか?それは良い解決策だと思います。Rubyオープンクラスについて考えてみましょう。既存のクラスに関数を追加することは完全に有効であり、広く受け入れられています。
marco-fiset 2012

97
@ marco-fiset他の人とうまくいかないから!互換性のない変更でネイティブJavaScriptオブジェクトを変更しようとしている2つのライブラリがある場合、悪いことが起こります。jQueryとGoogleマップがこのデザインパターンに従っている場合、同じページに両方を配置することはできません。
daniellmb 2012

5
@daniellmb素晴らしい点。メソッド名をプレフィックスにすると、メソッドが列挙不可能になるため、これを回避できます。
mikemaccana 2013

60
「ネイティブJavaScriptオブジェクトを変更しない」ステートメントは、「gotoを使用しない」または「eval is evil」のように感じます。大丈夫な場合がたくさんあります。プロジェクトを完全に制御していて、もちろんそれをライブラリとしてリリースする予定がない場合は、この方法で問題は発生しません。
FoxMulder900 2015年

175

コントロールにテキスト変換 CSSスタイルを適用してみてください。

例えば: (text-transform: capitalize);

絶対に必要な場合にのみ、JSアプローチを使用してください。


36
-1。このcssは機能しますが、テキストがすべて大文字で始まる場合は効果がないため、ほとんどの人が期待するようには機能しません。 webmasterworld.com/forum83/7506.htm
ホイットニーランド、2011

2
@Akshar:小文字のルールは、タイトルのケースのルールに置き換えられます。cssはソースコンテンツを変更しないため、小文字のルールが削除され(ソースコンテンツがすべて大文字のまま)、タイトルケースルールが適用されます(何もしません)。
ドッカビ

42
JSはブラウザーの外部で使用されます。
mikemaccana 2013

4
問題は、「文字列をタイトルの大文字小文字に変換する簡単な方法はありますか?」でした。。この答えは文字列を変換しません。これは文字列の上に適用されるスタイルです。
kingPuppy

データベース内のデータをクリーンにして、サードパーティのサービスに渡すときやCSVにエクスポートするときにクリーンに使用できるようにする場合、CSSは実際にはオプションではありません。CSSは化粧品を対象としています。CSSは長年にわたって大きく成長しており、CSSを使用してこの種の問題を解決できますが、ソリューションは化粧品のままであり、根本的な問題を解決しません。
Adam Reis

118

これが私のバージョンです。IMOも理解しやすくエレガントです。

var str = "foo bar baz"

console.log(

str.split(' ')
   .map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())
   .join(' ')

)
// returns "Foo Bar Baz"


3
また、あなたはマッピングで部分文字列を小文字ことができます:str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
デイブ土地

5
電話に同意しない.toLowerCase()。「McDonald」などの名前や「ASAP」などの頭字語は、大文字を保持する必要があります。誰かが「heLLO」のような文字列を実際に渡した場合、アプリケーションは大文字が間違っていると想定すべきではありません。
Thomas Higginbotham 2017

1
@ThomasHigginbothamこれはどうですか? String.prototype.toTitleCase = function (blnForceLower) { var strReturn; (blnForceLower ? strReturn = this.toLowerCase() : strReturn = this); return strReturn .split(' ') .map(i => i[0].toUpperCase() + i.substr(1)) .join(' '); }
ショーンケンドル

はい、小文字を強制するオプションを提供することをお勧めします。
Thomas Higginbotham 2017

1
str単一の文字の場合、これは壊れます。
Madbreaks、

103

タイトルの大文字に変換すると同時に、定義された頭字語を大文字に、マイナーワードを小文字に保持する関数を次に示します。

String.prototype.toTitleCase = function() {
  var i, j, str, lowers, uppers;
  str = this.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
  });

  // Certain minor words should be left lowercase unless 
  // they are the first or last words in the string
  lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At', 
  'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
  for (i = 0, j = lowers.length; i < j; i++)
    str = str.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), 
      function(txt) {
        return txt.toLowerCase();
      });

  // Certain words such as initialisms or acronyms should be left uppercase
  uppers = ['Id', 'Tv'];
  for (i = 0, j = uppers.length; i < j; i++)
    str = str.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), 
      uppers[i].toUpperCase());

  return str;
}

例えば:

"TO LOGIN TO THIS SITE and watch tv, please enter a valid id:".toTitleCase();
// Returns: "To Login to This Site and Watch TV, Please Enter a Valid ID:"

1
私はあなたが好きで、ローマ数字を扱うときにも問題が発生します... I、II、III、IVなどでパッチを当てただけ
Marcelo

2
修繕。3行目の正規表現から変更されている/\w\S*/g/([^\W_]+[^\s-]*) */gこの問題に対処するために、上記@ awashburnさんのコメントあたり。
ジェフリーブース

2
を超える正規表現パターンを使用することで得られる利点はあります/\b\w+/gか?
マイケル-2014年

2
わかりませんが、ハイフネーションされた単語の問題を解決するために別のコメント投稿者の提案を単に受けていました。しかし、あなたの正規表現も同様に行うように見え、単純さは常に優れています。この投稿への後世及び将来の訪問者のために、私はちょうどから3行目に正規表現を変更/([^\W_]+[^\s-]*) */gする/\b\w+/gマイケルのコメント@あたり。より複雑な正規表現が必要な場合は、コメントしてください。
Geoffreyブース2014年

1
/\b[\w-\']+/gハイフン付きの単語とアポストロフィを単語に含めることができるように、3行目の正規表現をに変更しました。
Shamasis Bhattacharya 2014

47

私は他の答えよりも以下を好む。各単語の最初の文字のみを照合し、大文字にします。シンプルなコード、読みやすく、バイトが少ない。頭字語のゆがみを防ぐために、既存の大文字を保持します。ただし、常にtoLowerCase()最初に文字列を呼び出すことができます。

function title(str) {
  return str.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

これを文字列プロトタイプに追加すると'my string'.toTitle()、次のことが可能になります。

String.prototype.toTitle = function() {
  return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

例:


3
それはラムダとしてさらに良いですconst titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());
0xcaff

IEを壊したくはありませんでしたが、そうでなければ、アプリケーションがレガシーブラウザに依存していない場合は、もっと短くなる可能性があります。
トム・ケイ

これは部分的な解決策にすぎません-opは文字列をタイトルの大文字小文字に変換する方法を尋ねました。この答えはのような入力に対してはそれを達成しませんNoT qUiITe
Madbreaks、

@Madbreaks質問では、大文字と小文字が混在する入力を変換する必要があるとは規定されていませんでした。しかし、私は言及した答えを更新しましたtoLowerCase。頭字語を壊すことに注意してください。an HTML documentAn HTML DocumentVSAn Html Document
トム・ケイ

4
@Madbreaks最初の例は人為的なものでしたが、入力を大文字にすると出力は変更されないことを説明するのに適しています。そうは言っても、私は答えを現状のまま(編集が示唆しているtoLowerCase)開発者の意図を前提とするものよりも柔軟で有用であると感じています。このメソッドは、PHP(ucwords)やGolang(strings.Title)などの他の言語の同様の組み込みメソッドの機能も反映しています。.NET(TextInfo.ToTitleCase)は、大文字と小文字が混在する場合に興味深い動作をしますが、完全に大文字の文字列は変更されません。
トム・ケイ

20

参考のために正規表現を使用しない場合:

String.prototype.toProperCase = function() {
  var words = this.split(' ');
  var results = [];
  for (var i = 0; i < words.length; i++) {
    var letter = words[i].charAt(0).toUpperCase();
    results.push(letter + words[i].slice(1));
  }
  return results.join(' ');
};

console.log(
  'john smith'.toProperCase()
)


正規表現のないソリューションをありがとう!
lucifer63

20

var result =
  'this is very interesting'.replace(/\b[a-z]/g, (x) => x.toUpperCase())

console.log(result) // This Is Very Interesting


質問ですが、()構成はオプションのシーケンスのいずれかで一致を指定するためのものです。つまり、(a | b)はaまたはbに一致します。構造(。)は何をしますか?
マイケルブラックバーン

同じ質問があった人のために、それは置換セクションで使用される置換「ブロブ」を定義します。blobには順番に番号が付けられ、最初の()は$ 1に入れられ、2番目は$ 2に入れられます。私はこのサイトが便利だと思った:javascript.info/tutorial/regular-expressions-methods
Michael Blackburn

上記を機能させることはできませんが、正規表現ウィザードにはほど遠いです。私は'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;}) もう一度使用し ていますが、これは文字列の最初の文字を大文字にする場合にのみ機能しますが、必要な場合は、私の構成が機能します。
Michael Blackburn

1
なんらかの理由で、FF35はで窒息しているよう'$1'.toUpperCase()ですが、値が割り当てられるまでに大文字は処理されていません。関数を使用した'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })
回避策

みなさん、こんにちは。答えは決まっています!私が最初に投稿したときまでに、それが機能していたと確信しています。とにかく入力してくれてありがとう!
simo

17

toLowerCase文字列をすぐに入力し、toUpperCase各単語の最初の文字だけを入力することもできます。非常にシンプルな1ライナーになります。

function titleCase(str) {
  return str.toLowerCase().replace(/\b(\w)/g, s => s.toUpperCase());
}

console.log(titleCase('iron man'));
console.log(titleCase('iNcrEdible hulK'));


私はこの解決策が好きです。素晴らしくてシンプル。しかし、CoffeeScriptの少しがあなたの答えに落ち込んでいるように見えます(s => s.toUpperCase())。私のバリアントは、あなたがしたことを行うことですが、Stringオブジェクトを拡張します(物議を醸すように):Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})
Waz

1
@Waz、アイデアをありがとう!=>、つまりネイティブアロー関数(ES6)を明確にするために、リンクはサポートテーブルを提供するMozillla Docsにジャンプします。
KevBot 2017

16

これらのフィラーワードが心配な場合に備えて、大文字にしないことを関数にいつでも伝えることができます。

/**
 * @param String str The text to be converted to titleCase.
 * @param Array glue the words to leave in lowercase. 
 */
var titleCase = function(str, glue){
    glue = (glue) ? glue : ['of', 'for', 'and'];
    return str.replace(/(\w)(\w*)/g, function(_, i, r){
        var j = i.toUpperCase() + (r != null ? r : "");
        return (glue.indexOf(j.toLowerCase())<0)?j:j.toLowerCase();
    });
};

これがお役に立てば幸いです。

編集する

先頭のグルーワードを処理したい場合は、もう1つの変数を使用してこれを追跡できます。

var titleCase = function(str, glue){
    glue = !!glue ? glue : ['of', 'for', 'and', 'a'];
    var first = true;
    return str.replace(/(\w)(\w*)/g, function(_, i, r) {
        var j = i.toUpperCase() + (r != null ? r : '').toLowerCase();
        var result = ((glue.indexOf(j.toLowerCase()) < 0) || first) ? j : j.toLowerCase();
        first = false;
        return result;
    });
};

2
文字列を配列に分解できます。我々は、ポルトガル語、スペイン語、イタリア語とフランス語の前置詞を持つことができますので、:glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');
ジュニアMayhé

これは最初の単語の大文字化を保証しません。つまりにand another thingなりand Another Thingます。常に最初の単語を大文字にするエレガントな方法が必要です。
Brad Koch

@BradKoch-検索語として「and」、「de」などを使用するようにスペースで埋めると、「And Another And Another」が「And Another and Another」に置き換えられます。
Yimin Rong

H'Dyまたはナンバーワンのような-それはまたと'後のテキスト大文字を除く良い
luky

三項演算子を使用する代わりに、フォールバックを使用することができます:glue = glue || ['of'、 'for'、 'and'、 'a'];
tm2josep

14

上記のソリューションで使用されている正規表現が混乱している場合は、次のコードを試してください。

function titleCase(str) {
  return str.split(' ').map(function(val){ 
    return val.charAt(0).toUpperCase() + val.substr(1).toLowerCase();
  }).join(' ');
}

大好きです!配列への変換はありません。
neelmeg

1
ええと... それを配列に変換しますsplit 、表記mapを使用する必要がないことを意味するので、はっきりとは表示されません[]
MalcolmOcean

2
これは、2年前のa8mの回答と同じです。
マイケル-クレイシャーキーはどこですか

1
単一文字入力の改行。
Madbreaks

1
@AlexChaffeeが改訂履歴を確認します。a8mは元の回答で矢印関数を使用しませんでした。
ありがとう

9

「McDonald」、「MacDonald」、「O'Toole」、「D'Orazio」などの姓(タイトルの大文字小文字ではない)を処理できるこの関数を作成しました。ただし、小文字であることが多い "van"または "von"を含むドイツ語またはオランダ語の名前は処理されません... "de"も "Robert de Niro"のように小文字であることが多いと思います。これらはまだ対処する必要があります。

function toProperCase(s)
{
  return s.toLowerCase().replace( /\b((m)(a?c))?(\w)/g,
          function($1, $2, $3, $4, $5) { if($2){return $3.toUpperCase()+$4+$5.toUpperCase();} return $1.toUpperCase(); });
}

1
名前認識のための+1。ただし、「macy」も正しく扱いません。
ブライアリー2013年

これは、大文字と小文字の変換を正しく処理する唯一の関数であり、「米領バージン諸島」のようなイニシャルに気づきました。
ロドリゴポロ

あなたはmacyそこに否定的な先読みを置くことによって問題を回避することができますそう\b((m)(a?c))?(\w)なる\b((m)(a?c))?(\w)(?!\s)
Ste

8
var toMatch = "john w. smith";
var result = toMatch.replace(/(\w)(\w*)/g, function (_, i, r) {
      return i.toUpperCase() + (r != null ? r : "");
    }
)

動作しているようです...上記、「キツネ、キツネ?/ jumps / ^ over ^ the¡lazy!dog ...」と「C:/ program files / some vendor / theird 2nd application / a file1.txt」。

2ndではなく2Ndが必要な場合は、に変更できます/([a-z])(\w*)/g

最初のフォームは次のように簡略化できます。

function toTitleCase(toTransform) {
  return toTransform.replace(/\b([a-z])/g, function (_, initial) {
      return initial.toUpperCase();
  });
}

7

これを試して

String.prototype.toProperCase = function(){
    return this.toLowerCase().replace(/(^[a-z]| [a-z]|-[a-z])/g, 
        function($1){
            return $1.toUpperCase();
        }
    );
};

var str = 'john smith';
str.toProperCase();

7

コードでサードパーティのライブラリを使用できる場合、lodashにはヘルパー関数があります。

https://lodash.com/docs/4.17.3#startCase

_.startCase('foo bar');
// => 'Foo Bar'

_.startCase('--foo-bar--');
// => 'Foo Bar'
 
_.startCase('fooBar');
// => 'Foo Bar'
 
_.startCase('__FOO_BAR__');
// => 'FOO BAR'


7

これを最短の方法で試してください:

str.replace(/(^[a-z])|(\s+[a-z])/g, txt => txt.toUpperCase());

7

ES 6

str.split(' ')
   .map(s => s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase())
   .join(' ')

そうしないと

str.split(' ').map(function (s) {
    return s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase();
}).join(' ')

頭を上げてくださいs.slice(0, 1).toUpperCase()。最初の文字がまだ必要な場合は、おそらくそうでしょう。
WindsofTime 2016年

@jssridhar ES6のコードも修正する必要があります。
caiosm1005 2016

1
str単一の文字の場合はブレイク
Madbreaks '19

@jssridharの方が良いかもしれません.charAt(0).toUpperCase()
roydukkey 2018年

2
a8mの回答の複製
ありがとう

6

これらの回答のほとんどは、単語境界メタ文字(\ b)を使用する可能性を無視しているようです。それを利用したGreg Deanの回答の短いバージョン:

function toTitleCase(str)
{
    return str.replace(/\b\w/g, function (txt) { return txt.toUpperCase(); });
}

Jim-Bobのようなハイフン付きの名前でも機能します。


2
エレガントな部分的なソリューションですが、アクセントまたは大文字の文字列では機能しません。"SofíaVergara" => "SofíAVergara"または "SofíaVERGARA" => "SofíAVERGARA"が表示されます。2番目のケースは、.replace(...)の前に.toLowerCase()関数を適用することで解決できます。最初のケースでは、正しい正規表現を見つける必要があります。
Asereware 2014

2
うーん、これは正規表現の実装のバグのようですが、アクセント付き文字は単語文字である必要があると思います(ただし、これらのケースでは機能しないので、正しいです)。
lewax00 2014年

\w[A-Za-z0-9_]すべての文字ではなく、文字のみが含まれます。そのためには、Unicodeカテゴリを使用する必要があります\p{L}/u修飾子(ここを参照)との別のソリューションが必要です。\bこれは\W\wここを参照)の間でのみ機能します
cmbuckley

6

最も簡単なのはcssを使うことだと思います。

function format_str(str) {
    str = str.toLowerCase();
    return '<span style="text-transform: capitalize">'+ str +'</span>';
}

コードを更新してテストしました。これで動作するはずです。
ウォンディム2018

CSSは、JSが使用されている一部の環境でのみ使用できるため、このソリューションは現実的ではありません。また、インラインスタイルはすべてのコストで回避する必要があります。
Madbreaks '19

5

/\S+/g分音記号をサポートするために使用:

function toTitleCase(str) {
  return str.replace(/\S+/g, str => str.charAt(0).toUpperCase() + str.substr(1).toLowerCase());
}

console.log(toTitleCase("a city named örebro")); // A City Named Örebro

ただし、「s unshine(y ellow)」⇒「S unshine(y ellow)」


5

ここにリストされているtoTitleCase文法規則を考慮に入れる堅牢な関数が必要だったので、自分の答えを追加したかっ(Google推奨の記事)。入力文字列の長さに依存するさまざまなルールがあります。以下は、機能+単体テストです。

この関数は、空白を統合し、特殊文字を削除します(必要に応じて正規表現を変更します)。

toTitleCase関数

const toTitleCase = (str) => {
  const articles = ['a', 'an', 'the'];
  const conjunctions = ['for', 'and', 'nor', 'but', 'or', 'yet', 'so'];
  const prepositions = [
    'with', 'at', 'from', 'into','upon', 'of', 'to', 'in', 'for',
    'on', 'by', 'like', 'over', 'plus', 'but', 'up', 'down', 'off', 'near'
  ];

  // The list of spacial characters can be tweaked here
  const replaceCharsWithSpace = (str) => str.replace(/[^0-9a-z&/\\]/gi, ' ').replace(/(\s\s+)/gi, ' ');
  const capitalizeFirstLetter = (str) => str.charAt(0).toUpperCase() + str.substr(1);
  const normalizeStr = (str) => str.toLowerCase().trim();
  const shouldCapitalize = (word, fullWordList, posWithinStr) => {
    if ((posWithinStr == 0) || (posWithinStr == fullWordList.length - 1)) {
      return true;
    }

    return !(articles.includes(word) || conjunctions.includes(word) || prepositions.includes(word));
  }

  str = replaceCharsWithSpace(str);
  str = normalizeStr(str);

  let words = str.split(' ');
  if (words.length <= 2) { // Strings less than 3 words long should always have first words capitalized
    words = words.map(w => capitalizeFirstLetter(w));
  }
  else {
    for (let i = 0; i < words.length; i++) {
      words[i] = (shouldCapitalize(words[i], words, i) ? capitalizeFirstLetter(words[i], words, i) : words[i]);
    }
  }

  return words.join(' ');
}

正しいことを確認するための単体テスト

import { expect } from 'chai';
import { toTitleCase } from '../../src/lib/stringHelper';

describe('toTitleCase', () => {
  it('Capitalizes first letter of each word irrespective of articles, conjunctions or prepositions if string is no greater than two words long', function(){
    expect(toTitleCase('the dog')).to.equal('The Dog'); // Capitalize articles when only two words long
    expect(toTitleCase('for all')).to.equal('For All'); // Capitalize conjunctions when only two words long
    expect(toTitleCase('with cats')).to.equal('With Cats'); // Capitalize prepositions when only two words long
  });

  it('Always capitalize first and last words in a string irrespective of articles, conjunctions or prepositions', function(){
    expect(toTitleCase('the beautiful dog')).to.equal('The Beautiful Dog');
    expect(toTitleCase('for all the deadly ninjas, be it so')).to.equal('For All the Deadly Ninjas Be It So');
    expect(toTitleCase('with cats and dogs we are near')).to.equal('With Cats and Dogs We Are Near');
  });

  it('Replace special characters with space', function(){
    expect(toTitleCase('[wolves & lions]: be careful')).to.equal('Wolves & Lions Be Careful');
    expect(toTitleCase('wolves & lions, be careful')).to.equal('Wolves & Lions Be Careful');
  });

  it('Trim whitespace at beginning and end', function(){
    expect(toTitleCase(' mario & Luigi superstar saga ')).to.equal('Mario & Luigi Superstar Saga');
  });

  it('articles, conjunctions and prepositions should not be capitalized in strings of 3+ words', function(){
    expect(toTitleCase('The wolf and the lion: a tale of two like animals')).to.equal('The Wolf and the Lion a Tale of Two like Animals');
    expect(toTitleCase('the  three Musketeers  And plus ')).to.equal('The Three Musketeers and Plus');
  });
});

提供された文字列からかなりの特殊文字を削除していることに注意してください。プロジェクトの要件に対処するには、正規表現を微調整する必要があります。


タイトルケースを本当に処理するので、私はこのソリューションを好みます。「風と共に去りぬ」ではなく「風と共に去りぬ」
russellmania

5
"john f. kennedy".replace(/\b\S/g, t => t.toUpperCase())

1
サンプルとo'henryで動作しhorse's mouthますが、で奇妙なことを行います。
マイケル-クレイシャーキーはどこですか

"john f. kennEdy".toLowerCase().replace(/\b\S/g, t => t.toUpperCase())より良い🤔
w3debugger

@Proximoの回答を編集したくありませんでした:\b\Sは、「単語の境界」と「空白以外の単一の文字」を表す特殊な文字クラスです。したがって、正規表現は単語の境界に続くすべての1文字に一致し、指定された矢印関数を適用してその文字を大文字にします。
イェンス

4

「lewax00」ソリューションを使用して、スペースで始まる「w」または単語を開始する「w」を強制するこの単純なソリューションを作成しましたが、余分な中間スペースを削除できません。

"SOFÍA vergara".toLowerCase().replace(/\b(\s\w|^\w)/g, function (txt) { return txt.toUpperCase(); });

結果は「ソフィアベルガラ」です。


4

これがアクセント付き文字を処理する(フランス語では重要です!)私の関数で、lowers例外の処理のオン/オフを切り替えることができます。お役に立てば幸いです。

String.prototype.titlecase = function(lang, withLowers = false) {
    var i, string, lowers, uppers;

    string = this.replace(/([^\s:\-'])([^\s:\-']*)/g, function(txt) {
        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    }).replace(/Mc(.)/g, function(match, next) {
        return 'Mc' + next.toUpperCase();
    });

    if (withLowers) {
        if (lang == 'EN') {
            lowers = ['A', 'An', 'The', 'At', 'By', 'For', 'In', 'Of', 'On', 'To', 'Up', 'And', 'As', 'But', 'Or', 'Nor', 'Not'];
        }
        else {
            lowers = ['Un', 'Une', 'Le', 'La', 'Les', 'Du', 'De', 'Des', 'À', 'Au', 'Aux', 'Par', 'Pour', 'Dans', 'Sur', 'Et', 'Comme', 'Mais', 'Ou', 'Où', 'Ne', 'Ni', 'Pas'];
        }
        for (i = 0; i < lowers.length; i++) {
            string = string.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), function(txt) {
                return txt.toLowerCase();
            });
        }
    }

    uppers = ['Id', 'R&d'];
    for (i = 0; i < uppers.length; i++) {
        string = string.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), uppers[i].toUpperCase());
    }

    return string;
}

4

私たちはここオフィスで議論を重ねてきましたが、現在の方法でユーザーが名前を入力する方法を自動的に修正しようとすると、問題が発生する可能性があると考えています。

さまざまな種類の自動大文字がばらばらになるいくつかのケースが考えられます。これらは英語の名前だけのものであり、各言語には独自の複雑さがあります。

各名前の最初の文字の大文字化に関する問題:

•IBMなどの頭字語は入力できません。Ibmに変わります。

•マクドナルドの名前はマクドナルドに変わりますが、これは正しくありません。マクドナルドも同じです。

•マリートンクスなどの二重樽型の名前は、マリートンクスに変わります。

•O'Connorのような名前はO'connorに変わります。

これらのほとんどについては、それに対処するためのカスタムルールを作成できますが、これには以前と同じように頭字語に関する問題があり、新しい問題が発生します。

•MacDonaldなどのMacで名前を修正するルールを追加すると、Macyなどの名前が壊れてMacYになります。

私たちが思いついた唯一の解決策は決して誤りではなく、DBSも使用していると思われる総当たりの方法であるすべての文字を大文字にすることです。

したがって、プロセスを自動化したい場合は、すべての名前と単語の辞書とそれをどのように大文字にする必要があるかを考えずに行うことは不可能です。すべてをカバーするルールがない場合は、そのまま使用しないでください。単にユーザーを困らせ、自分の名前を正しく入力したい人に別の場所に行くように促します。


4

次に、css(および変換するテキストが大文字の場合はJavaScript)を使用した別の解決策を示します。

html

<span id='text'>JOHN SMITH</span>

js

var str = document.getElementById('text').innerHtml;
var return_text = str.toLowerCase();

CSS

#text{text-transform:capitalize;}

3

正規表現が怖い私たちのために(笑):

function titleCase(str)
{
    var words = str.split(" ");
    for ( var i = 0; i < words.length; i++ )
    {
        var j = words[i].charAt(0).toUpperCase();
        words[i] = j + words[i].substr(1);
    }
    return words.join(" ");
}


3

私の1行のソリューション:

String.prototype.capitalizeWords = function() {
    return this.split(" ").map(function(ele){ return ele[0].toUpperCase() + ele.slice(1).toLowerCase();}).join(" ");
};

その後、capitalizeWords()任意の文字列に対してメソッドを呼び出すことができます。例えば:

var myS = "this actually works!";
myS.capitalizeWords();

>>> This Actually Works

私の他の解決策:

function capitalizeFirstLetter(word) {
    return word[0].toUpperCase() + word.slice(1).toLowerCase();
}
String.prototype.capitalizeAllWords = function() {
    var arr = this.split(" ");
    for(var i = 0; i < arr.length; i++) {
        arr[i] = capitalizeFirstLetter(arr[i]);
    }
    return arr.join(" ");
};

その後、capitalizeWords()任意の文字列に対してメソッドを呼び出すことができます。例えば:

var myStr = "this one works too!";
myStr.capitalizeWords();

>>> This One Works Too

Greg Deanの回答に基づく代替ソリューション:

function capitalizeFirstLetter(word) {
    return word[0].toUpperCase() + word.slice(1).toLowerCase();
}
String.prototype.capitalizeWords = function() {
    return this.replace(/\w\S*/g, capitalizeFirstLetter);
};

その後、capitalizeWords()任意の文字列に対してメソッドを呼び出すことができます。例えば:

var myString = "yes and no";
myString.capitalizeWords()

>>> Yes And No

3

restパラメータの使用について誰も言及しなかったことに驚いた。以下は、ES6 Restパラメータを使用するシンプルな1ライナーです。

let str="john smith"
str=str.split(" ").map(([firstChar,...rest])=>firstChar.toUpperCase()+rest.join("").toLowerCase()).join(" ")
console.log(str)


2

これは、FreeCodeCampのBonfireの "タイトルケース"に対する私のソリューションに基づいています。このソリューションでは、最初に特定の文字列をすべて小文字に変換し、次にスペースに続くすべての文字を大文字に変換する必要があります。

正規表現を使用しない場合:

function titleCase(str) {
 return str.toLowerCase().split(' ').map(function(val) { return val.replace(val[0], val[0].toUpperCase()); }).join(' ');
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.