Rubyはすべての単語の最初の文字を大文字にします


162

すべての単語の最初の文字を大文字にし、残りを小文字にする必要があります...

manufacturer.MFA_BRAND.first.upcase

最初の文字を大文字に設定するだけですが、これが必要です:

ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four

回答:


217

これを試して:

puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')

#=> One Two Three Four

または

puts 'one TWO three foUR'.split.map(&:capitalize)*' '

7
splitあなたはそれをさらに短くすることができますので、デフォルトではスペースに分割されます:'one TWO three foUR'.split.map(&:capitalize).join(' ')
ミーシャ

@walteeおそらく.map(&:capitalize)、ドキュメントのどこにそれを見つけたかを説明できますか?それについての言及はありません。また、*' '2番目のコードスニペットの最後にあるとは何ですか?
macsplean 2013年

6
@macsplean &:methodに構文mapである配列内の各アイテムにメソッドを呼び出す簡潔の方法。次に、を呼び出しjoinて、その配列を文字列に変換できます。* ' 'ある参加を呼び出すための別の方法。これは、配列内の項目を乗算して文字列を作成するものと考えることができます。
アンドリュー、

283

Railsの場合:

"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'

レールなし:

"kirk douglas".split(/ |\_/).map(&:capitalize).join(" ")

#OBJECT IT OUT
def titleize(str)
  str.split(/ |\_/).map(&:capitalize).join(" ")
end

#OR MONKEY PATCH IT
class String  
  def titleize
    self.split(/ |\_/).map(&:capitalize).join(" ")
  end
end

Railsなし(#titleizeメソッドにパッチを当てるためにRailsのActiveSupportをロードしますString

require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"

(一部)#titleizeで処理される文字列の使用例

  • 「カークダグラス」
  • 「kirk_douglas」
  • 「カーク・ドゥグラス」
  • 「カークダグラス」
  • 「カークダグラス」

#titleize gotchas

Rails titleizeはダッシュやアンダースコアなどをスペースに変換し、特に@JamesMcMahonで指摘されている大文字と小文字を区別する状況で、他の予期しない結果を生成する可能性があります。

"hEy lOok".titleize #=> "H Ey Lo Ok"

これは、次のようなキャメルケースのコードを処理するためのものです。

"kirkDouglas".titleize #=> "Kirk Douglas"

このエッジケースに対処するには、#downcase#titleizeを実行する前に、まず文字列をクリーンアップします。もちろん、これを行うと、キャメルケースの単語の区切りがすべて消去されます。

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"

うまく機能するgem titleizeもあります。
zhon

6
タイトル化は見た目ほど単純ではありません。たとえば、「hEy LoOK」は「H Ey Lo Ok」になります
James McMahon

8
巨大なGOTCHA、titleizeは、ダッシュ(-)などの特定の文字を完全に削除します。"誰?-私" .titleize => "誰?私"
pixelearth '18 / 06/18

@pixelearthでは、すべてのダッシュを個々のスペースに変換しています。
boulder_ruby 2015

37

"hello world".titleize 「Hello World」を出力するはずです。


この出力"One Two Three Fo Ur"は、この場合の望ましい出力とは異なりますが、他の出力では望ましい場合があります。
リック・スミス、

3
これはRubyのメソッドではありません。これは、v2.2.1で導入されたActiveSupport(Rails)メソッドです
Zack Burt

20

別のオプションは、ブロックを取る正規表現とgsubを使用することです。

'one TWO three foUR'.gsub(/\w+/, &:capitalize)

これは単語間のダッシュなどを保存します
Beer Me

3
.gsub(/\b\w/, &:capitalize)「Jane mcCollins」のように、意図した大文字を単語内に保持します
user3680688


3
"hello world".split.each{|i| i.capitalize!}.join(' ')

1
変数を使用していない場合は、バング(!)演算子を使用する理由はありません
boulder_ruby

2
@boulder_ruby 「変数を使用していない場合にbang演算子を使用する理由がないというのは事実ではありません。」eachブロックの各反復の戻り値は破棄されています。!生成文字列の変更されたsplitインプレースを。がない場合!capitalizeイテレーションごとに1つの新しい大文字の文字列が作成され、すぐに破棄されます。最終結果は"hello world"、元の文字列とまったく同じになります。を使用する!と、split'd配列の各文字列が変更されるため、の結果eachは大文字の文字列の配列になります。
user513951 2014

1
ええ、あなたは単に使用することになっていますmap。しかし興味深いハック。ポイント
boulder_ruby 2014

1

配列内の各単語の最初の文字を大文字にしようとする場合は、次のように入力するだけです。

array_name.map(&:capitalize)


0

私はこれを同様の問題に使用しました:

'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }

これは、前の答えを試してみた次の奇妙なケースを処理します。

  • -などの非単語文字
  • éなどの名前に共通のアクセント付き文字
  • 文字列の途中の大文字
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.