স্ট্রিংয়ে রুবিতে একটি স্ট্রিং রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন


731

আমার সামগ্রীতে স্ট্রিং ভেরিয়েবল রয়েছে:

varMessage =   
            "hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"


            "/my/name/is/balaji.so\n"
            "call::myFunction(int const&)\n"
            "void::secondFunction(char const&)\n"
             .
             .
             .
            "this/is/last/line/liobrary.so"

স্ট্রিংয়ের মধ্যে আমাকে একটি সাব-স্ট্রিং খুঁজে পেতে হবে:

"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"

"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"

আমি এটি কিভাবে খুঁজে পেতে পারি? উপ-স্ট্রিং উপস্থিত আছে কি নেই তা আমাকে নির্ধারণ করতে হবে।



এটি করার বিভিন্ন উপায়ের ব্রেকডাউন করার জন্য stackoverflow.com/a/3878656/128421 দেখুন ।
টিন ম্যান

উত্তর:


1361

আপনি include?পদ্ধতিটি ব্যবহার করতে পারেন :

my_string = "abcdefg"
if my_string.include? "cde"
   puts "String includes 'cde'"
end

102
include?এটি কেস সেনসেটিভ মনে রাখবেন । সুতরাং my_stringউপরের উদাহরণে যদি এমন কিছু হয় "abcDefg"(বড় হাতের সাথে D), include?("cde")ফিরে আসত falsedowncase()কল করার আগে আপনি কিছু করতে চাইতে পারেন include?()
ফোর্টেক্স

4
এটি নিজের মধ্যে অন্তর্ভুক্ত করা আদর্শ নয় কারণ এটি যদি নীল পরীক্ষা = নীল পরীক্ষা.নাম পরীক্ষা করে তবে একটি নোমথোডেরর ফেলে দিতে পারে lude অন্তর্ভুক্ত? শূন্যতার জন্য: নীলক্লাসের সর্বদা মানটি প্রত্যাশিত মানতে রূপান্তর করা উচিত: - test.to_s.incolve? ("পরীক্ষা")
গ্যারি

@ গ্যারির পরামর্শ হ'ল যদি আপনার লক্ষ্য কোডের এই অংশে উত্থাপিত ব্যতিক্রমগুলি হ্রাস করতে হয়। এটি সর্বদা সেরা লক্ষ্য নয়। সাধারণত আপনি যদি কোডের এই মুহুর্তে একটি স্ট্রিং আশা করেন এবং পরিবর্তে কোনও মান শূন্য হয়, তবে এর অর্থ বোঝায় যে অপ্রত্যাশিত কিছু ঘটেছে এবং ব্যতিক্রম উত্থাপন যথাযথ। যদি এখানে কোনও শূন্যের অস্তিত্ব অপ্রত্যাশিত হয় তবে এটি ব্যবহার to_sকরে সমস্যাটি আড়াল হবে এবং উত্স এবং সমস্যা সনাক্তকরণের মধ্যে দূরত্ব বাড়িয়ে দেবে, এটি ডিবাগ করা আরও শক্ত করে তোলে।
লুক গ্রিফিথস

88

কেস যদি অপ্রাসঙ্গিক হয় তবে কেস-সংবেদনশীল নিয়মিত ভাব প্রকাশের পক্ষে ভাল সমাধান:

'aBcDe' =~ /bcd/i  # evaluates as true

এটি মাল্টি-লাইন স্ট্রিংয়ের জন্যও কাজ করবে।

আরও তথ্যের জন্য রুবির রেজিএক্সপ্রেস ক্লাসটি দেখুন।


11
যদি আপনি ব্যবহারকারীর ইনপুটটির সাথে মেলে এবং এই কৌশলটি ব্যবহার Regexp.escapeকরছেন তবে স্ট্রিংটিতে ব্যবহার করতে ভুলবেন না। বেশিরভাগ ব্যবহারের ক্ষেত্রে, some_str.include? substr.downcase()দ্রুত কাজ করা উচিত এবং আরও পাঠযোগ্য।
জ্যাক

4
এইভাবে একটি নিয়মিত এক্সপ্রেশন ব্যবহার করা অগত্যা ব্যবহারের চেয়ে দ্রুত হতে চলেছে 'aBcDe'.downcase.include?('bcd')। রেজেক্সের তাদের উদ্দেশ্য রয়েছে তবে বিল্ট-ইন পদ্ধতিগুলি যখন দ্রুত হয় তখন সেগুলি ব্যবহার করবেন না। প্রকৃত ডেটা পরীক্ষা করা হচ্ছে তার সাথে বেঞ্চমার্কিং অনেক কিছুই প্রকাশ করতে পারে।
টিন ম্যান

3
এটি সত্য হিসাবে মূল্যায়ন করে না। এটি 1 এর মূল্যায়ন করে যা সত্য নয়।
slindsey3000 13

2
!! ('aBcDe' = ~ / বিসিডি / i) সত্য বা মিথ্যা মূল্যায়ন করবে। ব্যবহার !! বাগ্ধারা
slindsey3000

2
বিকল্পভাবে, ম্যাচ ব্যবহার করবেন? একটি বুলিয়ান ফেরত দিতে:/bcd/i.match?('aBcDe')
ফেরেল_ইও

45

আপনি এটিও করতে পারেন ...

my_string = "Hello world"

if my_string["Hello"]
  puts 'It has "Hello"'
else
  puts 'No "Hello" found'
end

# => 'It has "Hello"'

এই উদাহরণটি রুবির স্ট্রিং #[]পদ্ধতি ব্যবহার করে ।


2
এটি এমন ঝরঝরে কৌশল যা আমি এর আগে দেখিনি। তবে #include?এখনও কিছুটা দ্রুত।
স্কট শুপবাচ

4
#include?আপনি যখন ফাঁকা জায়গাগুলির সাথে বাক্য নিয়ে কাজ করছেন তখন কাজ করে না কারণ #includeবাক্যটি শব্দের মধ্যে বিভক্ত হয় এবং তারপরে শব্দগুলি পৃথক অ্যারে মান হিসাবে ব্যবহার করে। এটি বাক্যগুলির জন্য নিখুঁতভাবে কাজ করে। +1
লুইসিমো

[]আরও তথ্যের জন্য রুবির স্ট্রিং পদ্ধতিটি দেখুন।
টিন ম্যান

32

ক্লিন্ট পাচেলের উত্তরটি প্রসারিত:

nilঅভিব্যক্তিটি মেলে না, তখন রুবিতে রিজেক্স ম্যাচিং ফিরে আসে । এটি যখন হয়ে যায়, এটি ম্যাচটি ঘটে এমন চরিত্রের সূচকটি ফিরিয়ে দেয়। উদাহরণ স্বরূপ:

"foobar" =~ /bar/  # returns 3
"foobar" =~ /foo/  # returns 0
"foobar" =~ /zzz/  # returns nil

এটি লক্ষ করা গুরুত্বপূর্ণ যে কেবল রুবিতে nilএবং বুলিয়ান এক্সপ্রেশনটি falseমিথ্যা হিসাবে মূল্যায়ন করে। একটি খালি অ্যারে, খালি হ্যাশ বা পূর্ণসংখ্য 0 সহ অন্যান্য সমস্ত কিছু সত্যের মূল্যায়ন করে।

এজন্য /foo/উপরের উদাহরণটি কাজ করে এবং কেন।

if "string" =~ /regex/

প্রত্যাশা অনুযায়ী কাজ করে, ifকোনও ম্যাচ ঘটলে কেবলমাত্র ব্লকের 'সত্য' অংশে প্রবেশ করে ।


21

উপরের গ্রহণযোগ্য উত্তরের চেয়ে আরও সাফল্যজনক প্রতিমা যা 3..১.০ এবং তারপরে রয়েছে) .in?:

my_string = "abcdefg"
if "cde".in? my_string
  puts "'cde' is in the String."
  puts "i.e. String includes 'cde'"
end

আমি এটি আরও পাঠযোগ্য বলে মনে করি।

in?আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন ।

আবার নোট করুন যে এটি কেবল কারাগারে উপলব্ধ এবং খাঁটি রুবি নয়।


2
এটি রেলের উপর নির্ভর করে, ওপি একটি রুবি সমাধানের জন্য বলেছিল
dft

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

1
স্ট্যাকওভারফ্লো . com/a/4239625/128421 দেখুন । এটি কারাগারে রয়েছে তবে নিয়মিত রুবি থেকে সহজেই রেলগুলির অ্যাক্টিভ সাপোর্ট কোর এক্সটেনশানগুলি ব্যবহার করা যেতে পারে যা কেবলমাত্র ছোট ছোট পদ্ধতির যেমন চেরি-বাছাইয়ের অনুমতি দেয় in?
টিন ম্যান

সঠিক টিটিনম্যান। "cde".in? my_stringখাঁটি রুবি ফলনে NoMethodError। তবে require 'active_support/core_ext/object/inclusion'এটির সাথে এটি কাজ করে, যা রেলগুলি থেকে বা কাট ডাউন অ্যাক্টিভ সাপোর্ট কোর এক্সটেনশানগুলি থেকে লোড করা যায় ।
stwr667

16

টার্নারি উপায়

my_string.include?('ahr') ? (puts 'String includes ahr') : (puts 'String does not include ahr')

অথবা

puts (my_string.include?('ahr') ? 'String includes ahr' : 'String not includes ahr')

11

আপনি স্ট্রিং এলিমেন্ট রেফারেন্স পদ্ধতিটি ব্যবহার করতে পারেন is[]

ক্যানের অভ্যন্তরে []হয় একটি আক্ষরিক সাবস্ট্রিং, একটি সূচক বা একটি রেজেক্স হতে পারে:

> s='abcdefg'
=> "abcdefg"
> s['a']
=> "a"
> s['z']
=> nil

যেহেতু nilবৈশিষ্ট্যগুলি একই হিসাবে falseএবং কোন সাবস্ট্রিং থেকে প্রত্যাগত []হয় trueযেন আপনি পদ্ধতি ব্যবহার আপনি যুক্তিবিজ্ঞান ব্যবহার করতে পারেন .include?:

0> if s[sub_s]
1>    puts "\"#{s}\" has \"#{sub_s}\""
1> else 
1*    puts "\"#{s}\" does not have \"#{sub_s}\""
1> end
"abcdefg" has "abc"

0> if s[sub_s]
1>    puts "\"#{s}\" has \"#{sub_s}\""
1> else 
1*    puts "\"#{s}\" does not have \"#{sub_s}\""
1> end
"abcdefg" does not have "xyz" 

কেবলমাত্র নিশ্চিত করুন যে আপনি একটি সূচকে একটি সাব স্ট্রিং দিয়ে বিভ্রান্ত করবেন না:

> '123456790'[8]    # integer is eighth element, or '0'
=> "0"              # would test as 'true' in Ruby
> '123456790'['8']  
=> nil              # correct

আপনি একটি রেজেক্সও ব্যবহার করতে পারেন:

> s[/A/i]
=> "a"
> s[/A/]
=> nil

2
এটি অসাধারণ
ক্রেগ

3

স্ট্রিংয়ে রুবিতে একটি স্ট্রিং রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?

আপনি যখন 'চেক' বলবেন তখন আমি ধরে নিয়েছি আপনি যে বুলিয়ানটি চান সে ক্ষেত্রে আপনি ব্যবহার করতে পারেন String#match?match?তার প্রথম প্যারামিটার হিসাবে স্ট্রিং বা রেজেক্সেস গ্রহণ করে, যদি এটি পূর্ববর্তী হয় তবে এটি স্বয়ংক্রিয়ভাবে একটি রেজেক্সে রূপান্তরিত হয়। সুতরাং আপনার ব্যবহারের ক্ষেত্রে হবে:

str = 'string'
str.match? 'strings' #=> false
str.match? 'string'  #=> true
str.match? 'strin'   #=> true
str.match? 'trin'    #=> true
str.match? 'tri'     #=> true

String#match?optionচ্ছিক দ্বিতীয় যুক্তির অতিরিক্ত যুক্ত সুবিধা রয়েছে যা একটি সূচক নির্দিষ্ট করে যা থেকে স্ট্রিংটি অনুসন্ধান করতে হবে। ডিফল্টরূপে এটি সেট করা আছে 0

str.match? 'tri',0   #=> true
str.match? 'tri',1   #=> true
str.match? 'tri',2   #=> false

2
user_input = gets.chomp
user_input.downcase!

if user_input.include?('substring')
  # Do something
end

এটি আপনাকে স্ট্রিংটিতে সাবস্ট্রিং রয়েছে কিনা তা পরীক্ষা করতে সহায়তা করবে

puts "Enter a string"
user_input = gets.chomp  # Ex: Tommy
user_input.downcase!    #  tommy


if user_input.include?('s')
    puts "Found"
else
    puts "Not found"
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.