Ruby'de String'deki ilk harf nasıl büyük harf yapılır?


134

upcaseYöntem dizenin tamamıyla istifade eder, ama ben sadece ilk harfini büyük gerekir.

Ayrıca, Almanca ve Rusça gibi birkaç popüler dili desteklemem gerekiyor.

Nasıl yaparım?


4
Bazı dillerin büyük harfle yazılması gereken ilk harfin ne olduğu konusunda farklı fikirleri olduğunu unutmayın. İrlandaca'da "i mBaile Átha Cliath" ("Dublin'de") - küçük harf 'm', büyük harf 'B' gibi şeyler yaparsınız. ( İrlandalı'nın bunu neden yaptığını ve neden mantıklı olduğunu merak ediyorsanız, bkz. En.wikipedia.org/wiki/Consonant_mutation#Celtic_languages .)
James Moore

3
Ayrıca #capitalize'ın ilk harf olmayan tüm harfleri küçülteceğini unutmayın ... ki bu her zaman istediğiniz şey değildir. ['space', 'UFO', 'NASA'].collect{|w| w.capitalize} #=> ['Space', 'Ufo', 'Nasa']
Huliax

Yanıtlar:


260

Hangi Ruby sürümünü kullandığınıza bağlıdır:

Ruby 2.4 ve üzeri:

Ruby v2.4.0 , Unicode büyük / küçük harf eşlemesini desteklediğinden , sadece çalışır :

"мария".capitalize #=> Мария

Ruby 2.3 ve altı:

"maria".capitalize #=> "Maria"
"мария".capitalize #=> мария

Sorun şu ki, sadece istediğiniz şeyi yapmıyor, марияyerine çıktı veriyor Мария.

Rails kullanıyorsanız, bunun kolay bir çözümü vardır:

"мария".mb_chars.capitalize.to_s # requires ActiveSupport::Multibyte

Aksi takdirde, unicode gem'i kurmanız ve şu şekilde kullanmanız gerekir:

require 'unicode'

Unicode::capitalize("мария") #=> Мария

Ruby 1.8:

Kodlama sihirli yorumunu kullandığınızdan emin olun :

#!/usr/bin/env ruby

puts "мария".capitalize

verir invalid multibyte char (US-ASCII), while:

#!/usr/bin/env ruby
#coding: utf-8

puts "мария".capitalize

hatasız çalışır, ancak gerçek büyük harf kullanımı için "Ruby 2.3 ve daha düşük" bölümüne de bakın.


19
Görünüşe göre hangisinin istenmeyen bir davranış olduğunu ortaya "my API is great".capitalizeçıkaracağını unutmayın My api is great. Yani bu cevap, yalnızca İLK harfinin büyük harfe çevrilmesini ve diğerlerinin dokunulmamasını istediğinden, soruyu gerçekten cevaplamıyor.
Daniel AR Werner

55

dizenin ilk kelimesinin ilk harfini büyük yaz

"kirk douglas".capitalize
#=> "Kirk douglas"

her kelimenin ilk harfini büyük yaz

Raylarda:

"kirk douglas".titleize
=> "Kirk Douglas"

VEYA

"kirk_douglas".titleize
=> "Kirk Douglas"    

Yakutta:

"kirk douglas".split(/ |\_|\-/).map(&:capitalize).join(" ") 
#=> "Kirk Douglas"

rayların dışında, ancak yine de titleize yöntemini kullanmak istiyor

require 'active_support/core_ext'
"kirk douglas".titleize #or capitalize

1
Saf bir Ruby çözümü için oy verin.
Rails'i

19

Ne yazık ki, bir makinenin düzgün şekilde yukarı / aşağı / büyük harfle yazması imkansızdır. Bir bilgisayarın anlaması için çok fazla bağlamsal bilgiye ihtiyacı var.

Bu nedenle Ruby'nin Stringsınıfı yalnızca ASCII karakterleri için büyük harf kullanımını destekler, çünkü orada en azından biraz iyi tanımlanmıştır.

"Bağlamsal bilgi" ile neyi kastediyorum?

Örneğin, idoğru şekilde büyük harf yazmak için metnin hangi dilde olduğunu bilmeniz gerekir. Örneğin İngilizce'de yalnızca iki is vardır: Inoktasız büyük harf ve noktalı küçük i. Ancak Türkçede dört is vardır: Inoktasız büyük İharf, ınoktalı büyük, noktasız küçük i, noktalı küçük . Yani, İngilizce 'i'.upcase # => 'I've Türkçe olarak 'i'.upcase # => 'İ'. Başka bir deyişle: 'i'.upcasedile bağlı olarak iki farklı sonuç döndürebildiğinden, dilini bilmeden bir kelimeyi doğru bir şekilde büyük harfle yazmak imkansızdır.

Ama Ruby dili bilmiyor, sadece kodlamayı biliyor. Bu nedenle, Ruby'nin yerleşik işlevselliği ile bir dizeyi uygun şekilde büyük harfle yazmak imkansızdır.

Bu da kötüleşiyor: Hatta ile dilini bilmeden, düzgün harf yapmak bazen imkansızdır. Örneğin, Almanca'da 'Maße'.upcase # => 'MASSE'( Maße , ölçüm anlamındaki Maß'ın çoğuludur ). Ancak, ( kütle anlamına gelir ). Peki nedir ? Başka bir deyişle: doğru bir şekilde büyük harf kullanımı tam gelişmiş bir Yapay Zeka gerektirir.'Masse'.upcase # => 'MASSE''MASSE'.capitalize

Yani, yerine bazen yanlış cevap verme, bazen Yakut seçer hiçbir cevap vermek hiç ASCII olmayan karakterler basitçe işlemleri yararlanmak / upcase / downcase göz ardı olsun neden. (Elbette ki yanlış sonuçlar da okur, ancak en azından kontrol etmesi kolaydır.)


4
Üzgünüm ama tartışmanız su tutmuyor. Ruby'nin hiçbir şekilde cevap vermemeyi seçtiği doğru değildir, Ruby her zaman bir cevap verir, bu genellikle yanlıştır - örneğin, "мария" .upcase asla "мария" döndürmemelidir, bu hiçbir bağlamda doğru değildir. Yapay zeka ihtiyacıyla ilgili aralarınız hiç alakalı değil - büyük harflerin bir diziye dönmesini engelleyen hiçbir şey yoktur, "i" yerine ['I', 'İ'] deyin ve hangi büyük harf kullanımının alakalı olduğuna arayanın karar vermesine izin verin belirli bir durumda. Şu anda Ruby'nin büyük ve küçük harf arasındaki dönüştürme işlemesi bozuk ve hepsi bu.
michau

2
-1 çünkü başkent Eszett var . Tamamen resmileştirilmemiş bazı alanların kullanılması, bu çözümün yalnızca AI ile mümkün olduğunun kanıtı olamaz.
Mike

15

Öyleyse, sadece ilk harfin nasıl büyük harfle yazılacağını ve geri kalanını nasıl bırakacağımızı biliyoruz, çünkü bazen arzu edilen budur:

['NASA', 'MHz', 'sputnik'].collect do |word|
  letters = word.split('')
  letters.first.upcase!
  letters.join
end

 => ["NASA", "MHz", "Sputnik"]

Arama capitalizesonuçlanır ["Nasa", "Mhz", "Sputnik"].


Tam aradığım şey için teşekkür ederim, başlıkları 'cümle durumuna' dönüştürmek için yararlı
Good Lux

2
word[0] = word[0].upcase
David

@ David. HAYIR! Bu, #collect'in çağrıldığı dizideki kelimelerin değerlerini değiştirir. Bu kötü bir yan etkidir.
Huliax

wordDeğişkeni kullanarak netleştirdiğim bu çözümün içteki 3 satırını değiştirerek, bir kelimenin ilk harfini büyük harfle yazmanın daha basit bir yolunu gösteriyordum . Elbette, daha fazla kelimeniz varsa, hepsini çağırın! ;)words.map{|word| word[0] = word[0].upcase}
David

@ David. Kodunuz tutar #capitalize!ve değil #capitalize. İkincisi, yeni bir String döndürürken, ilki yöntemin alıcısını değiştirir (bu durumda alıcı wordve yöntemdir #[]). Kodunuzu bir #collect bloğunun içinde kullandıysanız, her birinde aynı String nesnelerine sahip iki farklı dizi elde edersiniz (ve Dizeler değiştirilirdi). Bu normalde yapmak isteyeceğiniz bir şey değildir. Bunun farkında olsanız bile, diğer okuyucular bunu anlamalıdır.
Huliax

8

Raylar 5+

Aktif Destek ve Rails 5.0.0.beta4 itibariyle her iki yöntemden birini kullanabilirsiniz: String#upcase_firstveya ActiveSupport::Inflector#upcase_first.

"my API is great".upcase_first #=> "My API is great"
"мария".upcase_first           #=> "Мария"
"мария".upcase_first           #=> "Мария"
"NASA".upcase_first            #=> "NASA"
"MHz".upcase_first             #=> "MHz"
"sputnik".upcase_first         #=> "Sputnik"

Daha fazla bilgi için " Rails 5: Yeni upcase_first Yöntemi " ni kontrol edin .


3

Kullanın capitalize. Gönderen Dize belgelerinde:

İlk karakter büyük harfe ve kalanı küçük harfe dönüştürülmüş str'nin bir kopyasını döndürür.

"hello".capitalize    #=> "Hello"
"HELLO".capitalize    #=> "Hello"
"123ABC".capitalize   #=> "123abc"

Orijinal dizenin değiştirilmesini istiyorsanız, yalnızca ünlem işaretini kullanın.
Magnar

doh Teşekkürler, hatamı düzelttim.
jhwist

5
-1. OP , ASCII olmayan karakterler anlamına gelen Almanca ve Rusça metinden açıkça bahsetmektedir. String#upcase(ve ayrıca String#downcase) yalnızca ASCII karakterleri için tanımlanmıştır.
Jörg W Mittag

1
Ruby 2.5.0'ı bugün kullanmak ve String#upcaseASCII olmayan karakterlerde iyi çalışıyor gibi görünüyor. 2.5.0 :001 > "мария".upcase => "МАРИЯ"
Huliax

1
@Huliax Kabul edilen cevapta belirtildiği gibi, bu yalnızca Ruby 2.4.0'dan beri geçerlidir (2016'da piyasaya sürüldü).
nisetama

2

Kullanabilirsiniz mb_chars. Bu umlaute saygı duyar:

class String

  # Only capitalize first letter of a string
  def capitalize_first
    self[0] = self[0].mb_chars.upcase
    self
  end

end

Misal:

"ümlaute".capitalize_first
#=> "Ümlaute"

0

Aşağıda, bir dizedeki her kelimeyi büyük harfle yazmanın başka bir yolu var. \wKiril karakterleri veya Latin karakterleri aksan işaretleriyle eşleştirmez, ancak eşleşir [[:word:]]. upcase, downcase, capitalizeVe swapcase2016 yılında serbest bırakıldı Ruby 2.4.0 kadar ASCII olmayan karakterler için geçerli değildi.

"aAa-BBB ä мария _a a_a".gsub(/\w+/,&:capitalize)
=> "Aaa-Bbb ä мария _a A_a"
"aAa-BBB ä мария _a a_a".gsub(/[[:word:]]+/,&:capitalize)
=> "Aaa-Bbb Ä Мария _a A_a"

[[:word:]] şu kategorilerdeki karakterlerle eşleşir:

Ll (Letter, Lowercase)
Lu (Letter, Uppercase)
Lt (Letter, Titlecase)
Lo (Letter, Other)
Lm (Letter, Modifier)
Nd (Number, Decimal Digit)
Pc (Punctuation, Connector)

[[:word:]]"Noktalama, Bağlayıcı" ( Pc) kategorisindeki 10 karakterin tümüyle eşleşir :

005F _ LOW LINE
203F ‿ UNDERTIE
2040 ⁀ CHARACTER TIE
2054 ⁔ INVERTED UNDERTIE
FE33 ︳ PRESENTATION FORM FOR VERTICAL LOW LINE
FE34 ︴ PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
FE4D ﹍ DASHED LOW LINE
FE4E ﹎ CENTRELINE LOW LINE
FE4F ﹏ WAVY LOW LINE
FF3F _ FULLWIDTH LOW LINE

Bu, bir dizenin yalnızca ilk karakterini büyük harfe dönüştürmenin başka bir yoludur:

"striNG".sub(/./,&:upcase)
=> "StriNG"
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.