अगर रूबी में एक स्ट्रिंग दूसरे स्ट्रिंग से शुरू होती है तो मुझे कैसे पता चलेगा?


जवाबों:


254
puts 'abcdefg'.start_with?('abc')  #=> true

[संपादित करें] यह कुछ ऐसा है जो मुझे इस सवाल से पहले नहीं पता था: start_withकई तर्क देता है।

'abcdefg'.start_with?( 'xyz', 'opq', 'ab')

1
MRI 1.8.7 के पास नहीं है start_with?, लेकिन MRI 1.9 करता है, जैसा कि रेल करता है।
वेन कॉनराड

@Wayne कॉनरोड: अजीब, 1.8.7 करता है के लिए दस्तावेज String#start_with?
जॉर्ग डब्ल्यू मित्तग

@ Jörg W Mittag, शायद अजीब नहीं, मैं गलत था। एमआरआई 1.8.7 वास्तव में है start_with?। मुझे लगता है कि मैं इसे टाइप करूँगा जब मैंने इसे आज़माने के लिए irb को लोड किया।
वेन कॉनराड

7
दिलचस्प है, रेल व्याकरण संबंधी सही को परिभाषित करता है starts_with?, जो 1.8.7 और इसके बाद के संस्करण को केवल उर्फ ​​किया जाता है start_with?
मार्क थॉमस

56

चूंकि यहां कई तरीके प्रस्तुत किए गए हैं, मैं यह पता लगाना चाहता था कि कौन सा सबसे तेज था। रूबी 1.9.3p362 का उपयोग करना:

irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> Benchmark.realtime { 1.upto(10000000) { "foobar"[/\Afoo/] }}
=> 12.477248
irb(main):003:0> Benchmark.realtime { 1.upto(10000000) { "foobar" =~ /\Afoo/ }}
=> 9.593959
irb(main):004:0> Benchmark.realtime { 1.upto(10000000) { "foobar"["foo"] }}
=> 9.086909
irb(main):005:0> Benchmark.realtime { 1.upto(10000000) { "foobar".start_with?("foo") }}
=> 6.973697

तो ऐसा लगता है कि यह start_with?गुच्छा का सबसे तेज है।

रूबी 2.2.2p95 और एक नई मशीन के साथ अपडेट किए गए परिणाम:

require 'benchmark'
Benchmark.bm do |x|
  x.report('regex[]')    { 10000000.times { "foobar"[/\Afoo/] }}
  x.report('regex')      { 10000000.times { "foobar" =~ /\Afoo/ }}
  x.report('[]')         { 10000000.times { "foobar"["foo"] }}
  x.report('start_with') { 10000000.times { "foobar".start_with?("foo") }}
end

            user       system     total       real
regex[]     4.020000   0.000000   4.020000 (  4.024469)
regex       3.160000   0.000000   3.160000 (  3.159543)
[]          2.930000   0.000000   2.930000 (  2.931889)
start_with  2.010000   0.000000   2.010000 (  2.008162)

4
नियमित रूप से अभिव्यक्ति के लिए दिए गए संकलन और परीक्षण में आश्चर्य की बात नहीं है, तो बस बाइट्स की तुलना करना कठिन है
akostadinov

1
यह ध्यान दिया जाना चाहिए कि रेगेक्स केस असंवेदनशील खोजों के लिए बहुत बेहतर है, भले ही आपने समय से पहले परीक्षण स्ट्रिंग के लिए सभी मामलों की गणना की हो।
पीटर पी।

3
@PeterP। मैंने सिर्फ केस असंवेदनशील खोजों का परीक्षण किया, और start_with? अभी भी आगे निकलता है अगर आप खोज के लिए स्ट्रिंग को नीचे करते हैं और फिर लोअरकेस खोज स्ट्रिंग के साथ तुलना करें "FooBar".downcase.start_with?("foo"):।
हैलो

4

स्टेन्सलैग द्वारा उल्लिखित विधि का अर्थ है, और इस प्रश्न के दायरे को देखते हुए इसे सही उत्तर माना जाना चाहिए। हालांकि यह भी जानने योग्य है कि यह एक नियमित अभिव्यक्ति के साथ प्राप्त किया जा सकता है, जो कि अगर आप रूबी में पहले से परिचित नहीं हैं, तो सीखने के लिए एक महत्वपूर्ण कौशल है।

रुबुलर के साथ एक नाटक करें: http://rubular.com/

लेकिन इस मामले में, निम्न रूबी कथन सही होगा यदि बाईं ओर स्ट्रिंग 'एबीसी' से शुरू होती है। सही पर रेगेक्स शाब्दिक अर्थ में 'ए' स्ट्रिंग की शुरुआत है। रूबुलर के साथ एक नाटक करें - यह स्पष्ट हो जाएगा कि चीजें कैसे काम करती हैं।

'abcdefg' =~  /\Aabc/ 

जैसा कि वेन कॉनराड द्वारा बताया गया है, यह विधि भी start_with वसीयत की तुलना में व्यापक रनटाइम पर काम करेगी।
पाक्खा

2

मुझे पसंद है

if ('string'[/^str/]) ...

8
आपको [/\Astr/]यहां उपयोग करना चाहिए । आपका रेगेक्स भी मेल खाता है "another\nstring"
हैलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.