Ruby her kelimeyi ilk harfi büyük yapar


162

Her kelimenin ilk karakterini büyük harf yapmalı, gerisini küçük harf yapmalıyım ...

manufacturer.MFA_BRAND.first.upcase

sadece ilk harf büyük ayarlıyor, ama buna ihtiyacım var:

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

Yanıtlar:


217

bunu dene:

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

#=> One Two Three Four

veya

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

7
splitvarsayılan olarak uzaya bölünecek, böylece daha da kısa hale getirebilirsiniz:'one TWO three foUR'.split.map(&:capitalize).join(' ')
Mischa

@waltee Belgede bulduğunuz yeri açıklayabilir .map(&:capitalize)veya en azından işaret edebilir misiniz ? Buna bir referans bulamıyorum. Ayrıca, *' 'ikinci kod snippet'inin sonundaki anlaşma nedir?
macsplean

6
@macsplean &:methodsözdizimi mapa, dizideki her bir öğeye yöntemi çağırmak için kısa bir yol . Daha sonra joinbu diziyi bir dizeye dönüştürmek için arayabilirsiniz . Birleştirme * ' 'demenin alternatif bir yoludur . Bir dize oluşturmak için dizideki öğeleri birlikte çarpma olarak düşünebilirsiniz.
Andrew

283

Raylarda:

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

Raysız:

"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

Raysız (#titleize yöntemini yamalamak için rayların ActiveSupport'u yükleyin String)

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

#titleize tarafından işlenen (bazı) dize kullanım örnekleri

  • "kirk douglas"
  • "Kirk_douglas"
  • "Kirk-Douglas"
  • "Kirk Douglas"
  • "Kirk Douglas"

#titleize gotchas

Rails titleize, tire ve alt çizgi gibi şeyleri boşluklara dönüştürecek ve özellikle @JamesMcMahon'un işaret ettiği gibi büyük / küçük harfe duyarlı durumlarla beklenmedik sonuçlar doğurabilir:

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

çünkü deve kasalı kodun kullanılması gerekiyordu:

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

Bu son durumla başa çıkmak için #downcase#titleize çalıştırmadan önce dizenizi temizleyebilirsiniz. Elbette bunu yaparsanız, deveKasalı kelime ayrımlarını silersiniz:

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

Ayrıca güzel çalışan bir mücevher başlığı vardır.
zhon

6
Başlık boyutu göründüğü kadar basit değil, örneğin 'hEy LoOK', 'H Ey Lo Ok' oluyor
James McMahon

8
BÜYÜK GOTCHA, başlık, çizgi (-) gibi belirli karakterleri tamamen kaldıracaktır. "kim? - ben" .titleize => "Kim? Ben"
pixelearth

@pixelearth benim için tüm çizgileri bireysel alanlara dönüştürüyor.
boulder_ruby

37

"hello world".titleize hangi "Merhaba Dünya" çıktı gerekir.


Bu "One Two Three Fo Ur"çıkış, bu durumda istenen çıkıştan farklıdır, ancak diğerlerinde istenebilir.
Rick Smith

3
Bu bir Ruby yöntemi değildir; v2.2.1'de tanıtılan bir ActiveSupport (Rails) yöntemidir
Zack Burt

20

Başka bir seçenek, bir blok alan bir normal ifade ve gsub kullanmaktır:

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

Bu sözcükler arası tire vb. Korur
Beer Me

3
.gsub(/\b\w/, &:capitalize)kelimeler içinde amaçlanan büyük harf kullanımını korur, örneğin "Jane mcCollins"
user3680688


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

1
bir değişkenle çalışmıyorsanız patlama (!) operatörünü kullanmanız için bir neden yoktur
boulder_ruby

2
@boulder_ruby "Bir değişkenle çalışmıyorsanız patlama operatörünü kullanmanız için hiçbir neden yok" doğru değil. eachBloğun her yinelemesinin dönüş değeri atılır. !Tarafından üretilen dizeleri değiştiriyorsa splityerinde. Olmadan !, capitalizeatılmadan hemen sonra yineleme başına bir yeni harfle dize oluşturma ve olacaktır. Nihai sonuç "hello world", orijinal dize ile aynı olacaktır . İle !, her bir dize splitd' dizisi değiştiriliyor ve bu nedenle sonuç, eachaktifleştirilen şeritlerinin bir dizidir.
user513951

1
Evet, sadece kullanman gerekiyor map. İlginç olsa kesmek. Puanlar
boulder_ruby

1

Bir dizideki her kelimenin ilk harfini büyük yazmaya çalışıyorsanız, bunu basitçe koyabilirsiniz:

array_name.map (& harf)


0

Bunu benzer bir sorun için kullandım:

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

Bu, önceki cevapları denerken gördüğüm aşağıdaki garip durumları ele alıyor:

  • kelime olmayan karakterler gibi -
  • é gibi adlarda ortak aksanlı karakterler
  • dizenin ortasındaki büyük karakterler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.