जवाबों:
रूबी 2.5 के रूप में आप उपयोग कर सकते हैं delete_suffix
या delete_suffix!
एक तेज और पठनीय तरीके से इस लक्ष्य को हासिल करने के लिए।
विधियों पर डॉक्स यहाँ हैं ।
यदि आप जानते हैं कि प्रत्यय क्या है, तो यह मुहावरा है (और मैं तर्क दूंगा, यहाँ तक कि अन्य उत्तरों की तुलना में अधिक पठनीय है):
'abc123'.delete_suffix('123') # => "abc"
'abc123'.delete_suffix!('123') # => "abc"
यह शीर्ष उत्तर की तुलना में काफी तेज (लगभग 40% बैंग विधि के साथ) है। यहाँ उसी बेंचमार्क का परिणाम है:
user system total real
chomp 0.949823 0.001025 0.950848 ( 0.951941)
range 1.874237 0.001472 1.875709 ( 1.876820)
delete_suffix 0.721699 0.000945 0.722644 ( 0.723410)
delete_suffix! 0.650042 0.000714 0.650756 ( 0.651332)
मुझे उम्मीद है कि यह उपयोगी है - ध्यान दें कि विधि वर्तमान में एक रेगेक्स को स्वीकार नहीं करती है, यदि आप प्रत्यय नहीं जानते हैं तो यह समय के लिए व्यवहार्य नहीं है। हालाँकि, स्वीकृत उत्तर के रूप में ( अद्यतन: लेखन के समय ) वही तय करता है, मैंने सोचा कि यह कुछ लोगों के लिए उपयोगी हो सकता है।
What is the preferred way of removing the last n characters from a string?
irb> 'now is the time'[0...-4]
=> "now is the "
[0...-4]
[0..-4]
यदि आप जिन पात्रों को हटाना चाहते हैं, वे हमेशा समान वर्ण हैं, तो विचार करें chomp
:
'abc123'.chomp('123') # => "abc"
इसके फायदे chomp
हैं: कोई गिनती नहीं, और कोड अधिक स्पष्ट रूप से यह बताता है कि यह क्या कर रहा है।
बिना किसी बहस के, chomp
डॉस या यूनिक्स लाइन को समाप्त कर देता है, यदि या तो मौजूद है:
"abc\n".chomp # => "abc"
"abc\r\n".chomp # => "abc"
टिप्पणियों से, #chomp
एक सीमा का उपयोग करके बनाम उपयोग करने की गति का सवाल था । यहाँ एक बेंचमार्क की तुलना दो है:
require 'benchmark'
S = 'asdfghjkl'
SL = S.length
T = 10_000
A = 1_000.times.map { |n| "#{n}#{S}" }
GC.disable
Benchmark.bmbm do |x|
x.report('chomp') { T.times { A.each { |s| s.chomp(S) } } }
x.report('range') { T.times { A.each { |s| s[0...-SL] } } }
end
बेंचमार्क परिणाम (CRuby 2.13p242 का उपयोग करके):
Rehearsal -----------------------------------------
chomp 1.540000 0.040000 1.580000 ( 1.587908)
range 1.810000 0.200000 2.010000 ( 2.011846)
-------------------------------- total: 3.590000sec
user system total real
chomp 1.550000 0.070000 1.620000 ( 1.610362)
range 1.970000 0.170000 2.140000 ( 2.146682)
तो एक सीमा का उपयोग करने से ~ 22% की तुलना में चॉम्प तेज होता है।
chomp!()
स्ट्रिंग-इन-इन पर कार्रवाई करने के लिए उपयोग कर सकते हैं ।
str = str[0...-n]
मैं सुझाव दूंगा chop
। मुझे लगता है कि इसका उल्लेख टिप्पणियों में से एक में किया गया है, लेकिन लिंक या स्पष्टीकरण के बिना, इसलिए यहां मुझे लगता है कि यह बेहतर है:
यह केवल एक स्ट्रिंग से अंतिम वर्ण को निकालता है और आपको ऐसा करने के लिए कोई मान निर्दिष्ट करने की आवश्यकता नहीं है।
यदि आपको एक से अधिक चरित्रों को हटाने की आवश्यकता है तो chomp
आपका सबसे अच्छा दांव है। यह रूबी डॉक्स के बारे में क्या कहना है chop
:
हटाए गए अंतिम वर्ण के साथ एक नया स्ट्रिंग लौटाता है। यदि स्ट्रिंग \ r \ n के साथ समाप्त होती है, तो दोनों वर्ण हटा दिए जाते हैं। एक खाली स्ट्रिंग में चॉप लगाने से एक खाली स्ट्रिंग लौट आती है। स्ट्रिंग # chomp अक्सर एक सुरक्षित विकल्प है, क्योंकि यह स्ट्रिंग को अपरिवर्तित छोड़ देता है यदि यह रिकॉर्ड विभाजक में समाप्त नहीं होता है।
हालाँकि इसका उपयोग ज्यादातर विभाजकों को हटाने के लिए किया जाता है जैसे कि \r\n
मैंने इसे एक साधारण स्ट्रिंग से अंतिम वर्ण को हटाने के लिए उपयोग किया है, उदाहरण के s
लिए शब्द एकवचन बनाने के लिए।
अंतिम n
पात्रों को गिराना पहले length - n
पात्रों को रखने के समान है ।
सक्रिय समर्थन भी शामिल है String#first
और String#last
तरीकों जो एक सुविधाजनक तरीका प्रदान करते हैं रखने या प्रथम / अंतिम ड्रॉप करने n
वर्ण:
require 'active_support/core_ext/string/access'
"foobarbaz".first(3) # => "foo"
"foobarbaz".first(-3) # => "foobar"
"foobarbaz".last(3) # => "baz"
"foobarbaz".last(-3) # => "barbaz"
यदि आप रेल का उपयोग कर रहे हैं, तो कोशिश करें:
"my_string".last(2) # => "ng"
[संपादित]
पिछले 2 वर्णों के बिना स्ट्रिंग प्राप्त करने के लिए:
n = "my_string".size
"my_string"[0..n-3] # => "my_stri"
नोट: अंतिम स्ट्रिंग चार n-1 पर है। इसलिए, अंतिम 2 को हटाने के लिए, हम n-3 का उपयोग करते हैं।
आप हमेशा कुछ का उपयोग कर सकते हैं
"string".sub!(/.{X}$/,'')
X
हटाने के लिए वर्णों की संख्या कहां है।
या परिणाम को असाइन करने / उपयोग करने के साथ:
myvar = "string"[0..-X]
हटाने के लिए X
वर्णों की संख्या प्लस एक कहां है ।
slice()
विधि की जाँच करें :
यदि आप क्लास मेथड बनाने के साथ ठीक हैं और चाहते हैं कि आपके द्वारा काटे गए पात्र हों, तो यह आज़माएँ:
class String
def chop_multiple(amount)
amount.times.inject([self, '']){ |(s, r)| [s.chop, r.prepend(s[-1])] }
end
end
hello, world = "hello world".chop_multiple 5
hello #=> 'hello '
world #=> 'world'
रेगेक्स का उपयोग करना:
str = 'string'
n = 2 #to remove last n characters
str[/\A.{#{str.size-n}}/] #=> "stri"
x = "my_test"
last_char = x.split('').last
delete_suffix
रूबी 2.5 से उपयोग कर सकते हैं । अधिक जानकारी यहाँ ।