रूबी में एक स्ट्रिंग में पहले अक्षर को कैपिटल कैसे करें


134

upcaseविधि पूरी स्ट्रिंग फ़ायदा उठाने की है, लेकिन मैं केवल पहले अक्षर को कैपिटल की जरूरत है।

इसके अलावा, मुझे जर्मन और रूसी जैसी कई लोकप्रिय भाषाओं का समर्थन करने की आवश्यकता है।

मैं यह कैसे करुं?


4
इस बात से अवगत रहें कि कुछ भाषाओं के बारे में अलग-अलग विचार होते हैं कि पहला अक्षर पूंजीकृत होने के बारे में क्या है। आयरिश में, आप "i mBaile Cltha Cliath" ("डबलिन में") - लोअर-केस 'एम', अपर-केस 'बी' जैसी चीजें करते हैं। (देखें en.wikipedia.org/wiki/Consonant_mutation#Celtic_languages यदि आप इस बारे में उत्सुक हैं कि आयरिश ऐसा क्यों करेगा और यह समझ में क्यों आता है।)
जेम्स मूर

3
और यह भी ध्यान रखें कि #capitalize उन सभी अक्षरों को नीचे गिरा देगा, जो पहले अक्षर नहीं हैं ... जो हमेशा वह नहीं होता जो आप चाहते हैं। ['space', 'UFO', 'NASA'].collect{|w| w.capitalize} #=> ['Space', 'Ufo', 'Nasa']
20

जवाबों:


260

यह निर्भर करता है कि आप किस रूबी संस्करण का उपयोग करते हैं:

रूबी 2.4 और उच्चतर:

यह सिर्फ काम करता है, क्योंकि रूबी v2.4.0 यूनिकोड केस मैपिंग का समर्थन करता है:

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

रूबी 2.3 और निम्न:

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

समस्या यह है, यह सिर्फ वही नहीं करता है जो आप इसे चाहते हैं, यह марияइसके बजाय आउटपुट करता है Мария

यदि आप रेल का उपयोग कर रहे हैं तो एक आसान समाधान है:

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

अन्यथा, आपको यूनिकोड रत्न को स्थापित करना होगा और इसे इस तरह उपयोग करना होगा:

require 'unicode'

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

रूबी 1.8:

कोडिंग मैजिक कमेंट का उपयोग अवश्य करें :

#!/usr/bin/env ruby

puts "мария".capitalize

देता है invalid multibyte char (US-ASCII), जबकि:

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

puts "мария".capitalize

त्रुटियों के बिना काम करता है, लेकिन वास्तविक पूंजीकरण के लिए "रूबी 2.3 और निचले" अनुभाग भी देखें।


19
ध्यान दें कि जाहिरा तौर पर "my API is great".capitalizeउत्पादन होगा My api is greatजो शायद अवांछित व्यवहार है। इसलिए यह जवाब वास्तव में इस सवाल का जवाब नहीं देता है क्योंकि वह केवल यही चाहता है कि एफआईआरटी पत्र ऊपरी मामले में बदल जाए और अन्य लोग इससे अछूते रहें।
डैनियल ए.आर. वर्नर

55

स्ट्रिंग के पहले शब्द के पहले अक्षर को कैपिटलाइज़ करें

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

प्रत्येक शब्द के पहले अक्षर को बड़ा करें

रेल में:

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

या

"kirk_douglas".titleize
=> "Kirk Douglas"    

रूबी में:

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

रेल के बाहर, लेकिन अभी भी शीर्षक विधि का उपयोग करना चाहते हैं

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

1
एक शुद्ध रूबी समाधान के लिए Upvote। रेल को आग लगाने के लिए बहुत आलसी, और इसने चाल
चली

19

दुर्भाग्य से, किसी मशीन को ठीक से ऊपर चढ़ना / नीचे जाना / रोकना असंभव है। कंप्यूटर को समझने के लिए बहुत अधिक प्रासंगिक जानकारी की आवश्यकता है।

यही कारण है कि रूबी की Stringकक्षा केवल ASCII वर्णों के लिए पूंजीकरण का समर्थन करती है, क्योंकि वहां यह कम से कम कुछ अच्छी तरह से परिभाषित है।

मुझे "संदर्भ संबंधी जानकारी" से क्या मतलब है?

उदाहरण के लिए, iठीक से कैपिटल करने के लिए, आपको यह जानना होगा कि टेक्स्ट किस भाषा में है। उदाहरण के लिए, अंग्रेज़ी में केवल दो is हैं: Iएक डॉट के बिना कैपिटल और iएक डॉट के साथ छोटा । लेकिन तुर्की के पास चार iएस हैं: Iएक डॉट के बिना पूंजी İ, एक डॉट के साथ पूंजी , एक डॉट के ıबिना छोटी i, एक डॉट के साथ छोटी । तो, अंग्रेजी में 'i'.upcase # => 'I'और तुर्की में 'i'.upcase # => 'İ'। दूसरे शब्दों में: चूंकि 'i'.upcaseभाषा के आधार पर, दो अलग-अलग परिणाम वापस आ सकते हैं, इसलिए किसी शब्द को उसकी भाषा को जाने बिना उसे सही ढंग से कैपिटल करना स्पष्ट रूप से असंभव है।

लेकिन रूबी भाषा नहीं जानती, यह केवल एन्कोडिंग को जानती है। इसलिए रूबी की अंतर्निहित कार्यक्षमता के साथ एक स्ट्रिंग को ठीक से कैपिटल करना असंभव है।

यह बदतर हो जाता है: भाषा जानने के साथ भी, कभी-कभी पूंजीकरण ठीक से करना असंभव है। उदाहरण के लिए, जर्मन में, 'Maße'.upcase # => 'MASSE'( Maße Ma measurement का अर्थ बहुवचन माप है )। हालाँकि, 'Masse'.upcase # => 'MASSE'(मतलब द्रव्यमान )। तो, क्या है 'MASSE'.capitalize? दूसरे शब्दों में: सही ढंग से पूंजीकरण के लिए एक पूर्ण विकसित आर्टिफिशियल इंटेलिजेंस की आवश्यकता होती है।

तो, बजाय कभी कभी गलत जवाब देने के लिए, कभी कभी करने के लिए रूबी चुनता कोई जवाब नहीं देना बिल्कुल भी है, जिसके कारण गैर- ASCII वर्ण बस downcase / upcase / संचालन भुनाने में नजरअंदाज कर दिया जाता है। (जो बेशक गलत परिणाम भी पढ़ता है, लेकिन कम से कम यह जांचना आसान है।)


4
क्षमा करें, लेकिन आपके तर्क में पानी नहीं है। यह सच नहीं है कि रूबी हमेशा एक जवाब नहीं देने का विकल्प चुनती है, रूबी हमेशा एक जवाब देती है, जो अक्सर गलत होता है - जैसे "мария" ।upcase को कभी भी "мария" नहीं लौटाना चाहिए, जो किसी भी संदर्भ में सही नहीं है। और एआई की आवश्यकता के बारे में आपकी पाचनियाँ बिल्कुल भी प्रासंगिक नहीं हैं - ऐसा कुछ भी नहीं है जो किसी सरणी को बनाए रखने से बचाता है, '' I ','] '] को' i.up 'के लिए कहता है, और कॉलर को यह निर्णय लेने देता है कि कौन सा पूंजीकरण प्रासंगिक है। दी गई स्थिति में। वर्तमान में रूबी के ऊपरी और निचले हिस्से के बीच रूपांतरण की हैंडलिंग टूट गई है, और यह बात है।
मिचू

2
-1 क्योंकि एक राजधानी एसेट है । कुछ पूरी तरह से औपचारिक रूप से उपयोग किए गए क्षेत्र का उपयोग नहीं किया जा सकता है, केवल एआई के साथ उस समाधान का प्रमाण संभव है।
माइक

15

ठीक है, तो बस हम जानते हैं कि केवल पहले अक्षर को कैसे कैपिटल करें और बाकी को अकेले छोड़ दें, क्योंकि कभी-कभी यही होता है:

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

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

कॉलिंग में capitalizeपरिणाम होगा ["Nasa", "Mhz", "Sputnik"]


शुक्रिया, जो मैं देख रहा था, वह 'वाक्य मामले' में शीर्षासन करने के लिए उपयोगी है
Good Lux

2
word[0] = word[0].upcase
डेविड

@ दाऊद। नहीं! यह उस शब्द के मान को बदल देता है, जिस पर #collect कहा जाता है। यह एक बुरा दुष्प्रभाव है।
हुलियक्स

मैं इस समाधान की आंतरिक 3 पंक्तियों की जगह, एक शब्द के पहले अक्षर को कैपिटल करने के लिए एक सरल तरीका दिखा रहा था, जिसे मैंने wordचर का उपयोग करके स्पष्ट किया था । बेशक, यदि आपके पास अधिक शब्द हैं, तो बस उन सभी को कॉल करें! ;)words.map{|word| word[0] = word[0].upcase}
डेविड

@ दाऊद। आपका कोड मात्रा #capitalize!और नहीं #capitalize। उत्तरार्द्ध एक नया स्ट्रिंग लौटाता है जबकि पूर्व विधि के रिसीवर को संशोधित करता है (इस मामले में रिसीवर है wordऔर विधि है #[])। यदि आपने एक # ब्लॉक ब्लॉक के अंदर अपने कोड का उपयोग किया है, तो आप उनमें से प्रत्येक में एक ही स्ट्रिंग ऑब्जेक्ट्स के साथ दो अलग-अलग सरणियों को समाप्त करेंगे (और स्ट्रिंग्स को संशोधित किया गया होगा)। यह कुछ ऐसा नहीं है जिसे आप सामान्य रूप से करना चाहते हैं। यहां तक ​​कि अगर आप इसके बारे में जानते हैं, तो अन्य पाठकों को यह समझना चाहिए।
हुलियाक्स

8

रेल 5+

सक्रिय समर्थन और रेल 5.0.0.beta4 के रूप में आप दोनों विधियों में से किसी एक का उपयोग कर सकते हैं: String#upcase_firstया 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"

अधिक जानकारी के लिए " रेल्स 5: न्यू अपकेस_फर्स्ट मेथड " की जाँच करें ।


3

का उपयोग करें capitalize। से स्ट्रिंग प्रलेखन:

पहले अक्षर के साथ str की एक प्रति को अपरकेस में और शेष को निचले हिस्से में बदल देता है।

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

यदि आप मूल स्ट्रिंग को बदलना चाहते हैं तो केवल विस्मयादिबोधक बिंदु का उपयोग करें।
मग्न

doh धन्यवाद, मेरी गलती तय की।
झविस्ट

5
-1। ओपी स्पष्ट रूप से जर्मन और रूसी पाठ का उल्लेख करता है, जिसका अर्थ गैर-एएससीआईआई अक्षर है। String#upcase(और भी String#downcase) केवल ASCII वर्णों के लिए परिभाषित किए गए हैं।
जॉर्ग डब्ल्यू मित्तग

1
रूबी 2.5.0 का उपयोग आज और String#upcaseगैर- ASCII वर्णों पर ठीक काम करता है। 2.5.0 :001 > "мария".upcase => "МАРИЯ"
हुलियक्स

1
@Huliax जैसा कि स्वीकृत उत्तर में उल्लेख किया गया है, वह केवल रूबी 2.4.0 (जो 2016 में जारी किया गया था) के बाद से ही मामला है।
निसेतमा

2

आप उपयोग कर सकते हैं mb_chars। यह umlaute का सम्मान करता है:

class String

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

end

उदाहरण:

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

0

नीचे एक स्ट्रिंग में प्रत्येक शब्द को कैपिटलाइज़ करने का एक और तरीका है। \wसिरिलिक वर्णों या लैटिन वर्णों के साथ विकृति विज्ञान से मेल नहीं खाता, लेकिन [[:word:]]करता है। upcase, downcase, capitalize, और swapcaseरूबी 2.4.0 जो 2016 में जारी किया गया था जब तक गैर- ASCII वर्ण पर लागू नहीं होता।

"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:]] इन श्रेणियों के पात्रों से मेल खाता है:

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

[[:word:]]"विराम चिह्न, कनेक्टर" ( Pc) श्रेणी के सभी 10 वर्णों से मेल खाता है :

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

यह केवल स्ट्रिंग के पहले वर्ण को अपरकेस में बदलने का एक और तरीका है:

"striNG".sub(/./,&:upcase)
=> "StriNG"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.