রুবিতে অন্য স্ট্রিং দিয়ে একটি স্ট্রিং শুরু হলে আমি কীভাবে খুঁজে পাব?


উত্তর:


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

[সম্পাদনা] এটি এই প্রশ্নের আগে আমি জানতাম না: start_withএকাধিক যুক্তি গ্রহণ করে takes

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

1
এমআরআই 1.8.7 এর নেই start_with?, তবে এমআরআই 1.9 রয়েছে, যেমন রেলগুলি ।
ওয়েইন কনরাড

@Wayne কনরাড: স্ট্রেঞ্জলি, 1.8.7 করে প্রোগ্রামটির ডকুমেন্টেশন এবং আছে String#start_with?
Jörg ডব্লু মিটাগ

@ জার্গ ডব্লু মিটাগ, সম্ভবত আশ্চর্যের মতো নয়, আমি ভুল ছিলাম। এমআরআই 1.8.7 আসলে আছে start_with?। আমি অনুমান করি যে আমি যখন এটি চেষ্টা করার জন্য আইআরবি লোড করেছি তখন এটি টাইপ করেছি।
ওয়েইন কনরাড

7
মজার বিষয় হল, ব্যাকরণগুলি ব্যাকরণগত সঠিকটি সংজ্ঞায়িত করে starts_with?, যা ১.৮. above এবং তারপরে কেবলমাত্র প্রবণতাযুক্ত 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। আমি কেবল মামলার সংবেদনশীল অনুসন্ধান এবং স্টার্ট_ও পরীক্ষা করেছি? এখনো এগিয়ে আসে আউট যদি আপনি শুধু যে স্ট্রিংটি সন্ধান করা downcase এবং তারপর ছোট হাতের অনুসন্ধান স্ট্রিং সঙ্গে তুলনা: "FooBar".downcase.start_with?("foo")
haslo

4

স্টেনস্লাগ দ্বারা উল্লিখিত পদ্ধতিটি সংশ্লেষযোগ্য এবং প্রশ্নের সুযোগ দেওয়া হলে এটি সঠিক উত্তর হিসাবে বিবেচনা করা উচিত। তবে এটিও জেনে রাখা উচিত যে এটি একটি নিয়মিত প্রকাশের সাথে অর্জন করা যায়, যা আপনি যদি রুবির সাথে ইতিমধ্যে পরিচিত না হন তবে এটি শেখার একটি গুরুত্বপূর্ণ দক্ষতা।

রুবুলারের সাথে একটি নাটক রাখুন: http://rubular.com/

তবে এই ক্ষেত্রে, নীচের রুবি স্টেটমেন্টটি সত্য ফিরে আসবে যদি বাম দিকের স্ট্রিংটি 'abc' দিয়ে শুরু হয়। ডানদিকে রেজেক্স আক্ষরিক \ এ এর ​​অর্থ 'স্ট্রিংয়ের সূচনা'। রুবুলার সহ একটি খেলা আছে - এটি কীভাবে কাজ করে তা স্পষ্ট হয়ে যাবে।

'abcdefg' =~  /\Aabc/ 

ওয়েন কনরাড দ্বারা চিহ্নিত হিসাবে, এই পদ্ধতিটি স্টার্ট_উইথের চেয়ে বিভিন্ন ধরণের রানটাইমগুলিতেও কাজ করবে।
পাইকেহা

2

আমি পছন্দ করি

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

8
আপনি [/\Astr/]এখানে ব্যবহার করা উচিত । আপনার রেজেক্সও মেলে "another\nstring"
haslo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.