স্ট্রিং থেকে সাবস্ট্রিং সরান


193

আমি কেবল ভাবছি যে অন্য স্ট্রিং থেকে স্ট্রিং অপসারণের কোনও পদ্ধতি আছে? এটার মতো কিছু:

class String
  def remove(s)
    self[s.length, self.length - s.length]
  end
end

উত্তর:


263

আপনি স্লাইস পদ্ধতিটি ব্যবহার করতে পারেন:

a = "foobar"
a.slice! "foo"
=> "foo"
a
=> "bar"

একটি অ 'আছে!' সংস্করণ হিসাবে। অন্যান্য সংস্করণ সম্পর্কেও ডকুমেন্টেশনে আরও তথ্য দেখা যাবে: http://www.ruby-doc.org/core/classes/String.html#method-i-slice-21


1
খুবই ভদ্র! আপনি []নন-ব্যাং সংস্করণে এস ব্যবহার করতে পারেন ।
ম্যাথিউস মোরিরা

65
মুছে ফেলা পাঠ্য (বা অনুসন্ধান করা পাঠ্য) ফেরত দেওয়ার এটির খারাপ প্রভাব রয়েছে। মুছে ফেলার ফলাফলটিতে শৃঙ্খলাবদ্ধ হওয়ার জন্য দুর্ভাগ্য।
মাইক

10
আপনি কাটা স্ট্রিংটি কীভাবে ফিরে আসবেন এবং আসলটি কীভাবে প্রভাবিত করবেন না? উদাহরণস্বরূপ যদি আমার "হ্যালো ওয়ার্ল্ড" থাকে তবে আমি "হ্যালো" কে টুকরো টুকরো করতে চাই এবং মূল স্ট্রিং অবজেক্টটি পরিবর্তন না করে কেবল "ওয়ার্ল্ড" অংশটি ফিরিয়ে দিতে চাই?
jhabbott

14
@ মাইক"foobar".tap{|s| s.slice!("foo")}.upcase
আর্নেস্ট

7
@ বেকারম্যান - deleteকাজ করবে না, যেহেতু এটি আপনার পাস করা সমস্ত চরিত্র মুছে ফেলে:'hello world'.delete('hello') #=> ' wrd'
মরিচা

165

কিভাবে রুবি ডকstr.gsub("subString", "") চেক আউট


38
subএর চেয়ে আরও উপযুক্ত হতে পারে gsub, যেহেতু ওপি কেবল স্ট্রিংয়ের শুরু থেকে স্ট্রিংগুলি সরাতে চায় , সমস্ত স্ট্রিংয়ের মাধ্যমে নয় (তার নমুনা কোডটি দেখুন)। এবং এর মতো একটি রেজেক্স ব্যবহার করা আরও ভাল হবে: str.sub(/^subString/, '')- কারণ এটি নিশ্চিত করে যে কেবল সাবস্ট্রিংটি কেবল প্রথম থেকেই মুছে ফেলা হবে।
অ্যালেক্স ডি

@ অ্যালেক্সডি একটি রেজেক্স ব্যবহার করা আরও ভাল হবে তবে আমরা যদি নিশ্চিত না হতে পারি subStringযে কোনও রেগেক্স বিশেষ অক্ষরকে অন্তর্ভুক্ত না করে তবে এটি বিপজ্জনক ।
ডেভিড মোলেস

@ ডেভিডমোলস, এই ক্ষেত্রে, /^subString/একটি আক্ষরিক, তাই আমরা খুব নিশ্চিত হতে পারি যে এটিতে কোনও মেটাচার্যাক্টর অন্তর্ভুক্ত নেই। আপনি যদি একটি Regex মধ্যে কিছু অন্যান্য স্ট্রিং বদলে হয়, আপনি এটা করতে পারেন: /#{Regexp.escape(str)}/
অ্যালেক্স

উত্তরে হ্যাঁ, তবে ওপি-র প্রশ্নে নয়। Regexp.escape()যদিও পয়েন্টারের জন্য ধন্যবাদ ।
ডেভিড মোলস

106

যদি এটি স্ট্রিংয়ের সমাপ্তি হয় তবে আপনি এটি ব্যবহার করতে পারেন chomp:

"hello".chomp("llo")     #=> "he"

যদি অভিব্যক্তিটি a.chomp ("llo") হত, ছম্প! আরও সুনির্দিষ্ট
ফার্নান্দো গঞ্জালেজ সানচেজ

1
এটি স্লাইসের চেয়ে পরিষ্কার! কারণ এর কোনও পার্শ্ব প্রতিক্রিয়া নেই।
আরদী আরম

5
যদি এটি স্ট্রিংয়ের শুরু থেকে হয় তবে আপনি এর সাথেও chompমিশ্রণে ব্যবহার করতে পারেন reverse:"hello".reverse.chomp("he".reverse).reverse #=> "llo"
amoebe

45

আপনার যদি লক্ষ্য স্ট্রিংয়ের কেবল একটির উপস্থিতি থাকে তবে আপনি এটি ব্যবহার করতে পারেন:

str[target] = ''

অথবা

str.sub(target, '')

আপনার যদি লক্ষ্য ব্যবহারের একাধিক ঘটনা থাকে:

str.gsub(target, '')

এই ক্ষেত্রে:

asdf = 'foo bar'
asdf['bar'] = ''
asdf #=> "foo "

asdf = 'foo bar'
asdf.sub('bar', '') #=> "foo "
asdf = asdf + asdf #=> "foo barfoo bar"
asdf.gsub('bar', '') #=> "foo foo "

আপনাকে যা করতে হবে তাহলে জায়গা বদল ব্যবহার "!"সংস্করণ gsub!এবং sub!


2
রুবি মজাদার! সত্যিকারের মতো জিনিসগুলি দেখতে সত্যিই উপভোগ করুন:asdf['bar'] = ''
পিটার বাটকোভিক

1
আমি "মজাদার" বলব না - সম্ভবত অন্তর্দৃষ্টিহীন।
Jmoney38

31

আপনি যদি রেল ব্যবহার করেন তবে তাও আছে remove

যেমন "Testmessage".remove("message")ফলন "Test"

সতর্কতা: এই পদ্ধতিটি সমস্ত উপস্থিতি সরিয়ে দেয়


1
এটি কোনও ভ্যানিলা রুবির উত্তর নয়, তবে গৃহীত উত্তরটি বেশিরভাগ লোকেরা সন্ধান করছেন এমনটি নয়। দুর্ভাগ্যক্রমে sliceপদ্ধতিটি কাটা স্ট্রিংয়ের অংশটি ফিরিয়ে দেয় না, এটি "ছুরি" ফিরিয়ে দেয়
ডিলান পিয়ার্স

1
@ ডায়ালান পিয়ার্স এটি ব্যবহার করে এমন একটি ফাংশন বাস্তবায়ন করা বেশ সহজslice! def gimme_the_slice(my_string, my_slice) my_string.slice!(my_slice) my_string
বেনেট টাল্পার

1
আহ ঠিক আছে, ব্যাং-আইফিং হ'ল রুবি কীভাবে বিদ্যমান ভেরিয়েবলটি পরিবর্তন করে। ধন্যবাদ @ বেনেটটাল্পার্স
ডিলান পিয়ার্স

26

রুবি 2.5+

যদি আপনার স্ট্রিংয়ের শুরুতে কোনও স্ট্রিংয়ের শেষে থাকে, তবে রুবি 2.5 এটির জন্য পদ্ধতিগুলি চালু করেছে:



1

আমি যদি সঠিক ব্যাখ্যা দিচ্ছি, তবে এই প্রশ্নটি স্ট্রিংগুলির মধ্যে বিয়োগ (-) অপারেশনের মতো কিছু অনুরোধ করবে বলে মনে হচ্ছে বিল্ট-ইন প্লাস (+) অপারেশন (কনটেনটেশন) এর বিপরীত।

পূর্ববর্তী উত্তরের মতো নয়, আমি এমন একটি ক্রিয়াকলাপ সংজ্ঞায়িত করার চেষ্টা করছি যা অবশ্যই সম্পত্তিটি মানবে:

যদি সি = a + বি তত সি - এ = বি এবং গ - বি = এ

এটি অর্জনের জন্য আমাদের কেবল তিনটি বিল্ট-ইন রুবি পদ্ধতি প্রয়োজন:

'abracadabra'.partition('abra').values_at(0,2).join == 'cadabra'

এটি কীভাবে কাজ করে তা আমি ব্যাখ্যা করব না কারণ এটি একবারে একটি পদ্ধতি চালানো সহজেই বোঝা যায়।

কনসেপ্ট কোডের একটি প্রমাণ এখানে দেওয়া হয়েছে:

# minus_string.rb
class String
  def -(str)
    partition(str).values_at(0,2).join
  end
end

# Add the following code and issue 'ruby minus_string.rb' in the console to test
require 'minitest/autorun'

class MinusString_Test < MiniTest::Test

  A,B,C='abra','cadabra','abracadabra'

  def test_C_eq_A_plus_B
    assert C == A + B
  end

  def test_C_minus_A_eq_B
    assert C - A == B
  end

  def test_C_minus_B_eq_A
    assert C - B == A
  end

end

আপনি যদি একটি সাম্প্রতিক রুবি সংস্করণ (> = 2.0) ব্যবহার করেন তবে পরামর্শের একটি শেষ শব্দ: আগের উদাহরণের মতো বানর-প্যাচিং স্ট্রিংয়ের পরিবর্তে পরিশোধন ব্যবহার করুন ।

এটি যতটা সহজ:

module MinusString
  refine String do
    def -(str)
      partition(str).values_at(0,2).join
    end
  end
end

এবং using MinusStringযেখানে আপনার যেগুলি ব্লক প্রয়োজন সেখানে যুক্ত করুন।


পরিমার্জনীয় ধারণার জন্য +1। যদিও বানর-প্যাচিং স্ট্রিং ক্লাসটি সম্ভবত এই ব্যবহারের ক্ষেত্রে একটি ওভারকিল, কখনও কখনও আমাদেরকে বানর-প্যাচ জিনিসগুলি থাকতে হয় এবং এটি পরিমার্জনের ধারণাটি সত্যই এটিতে জ্বলজ্বল করে।
আশ্চর্য 1

-2

এখানে আমি কি করব

2.2.1 :015 > class String; def remove!(start_index, end_index) (end_index - start_index + 1).times{ self.slice! start_index }; self end; end;
2.2.1 :016 >   "idliketodeleteHEREallthewaytoHEREplease".remove! 14, 32
 => "idliketodeleteplease" 
2.2.1 :017 > ":)".remove! 1,1
 => ":" 
2.2.1 :018 > "ohnoe!".remove! 2,4
 => "oh!" 

একাধিক লাইনে ফর্ম্যাট করা:

class String
    def remove!(start_index, end_index)
        (end_index - start_index + 1).times{ self.slice! start_index }
        self
    end 
end

-7
def replaceslug
  slug = "" + name
    @replacements = [
      [ "," , ""],
      [ "\\?" , ""],
      [ " " , "-"],
      [ "'" , "-"],
      [ "Ç" , "c"],
      [ "Ş" , "s"],
      [ "İ" , "i"],
      [ "I" , "i"],
      [ "Ü" , "u"],
      [ "Ö" , "o"],
      [ "Ğ" , "g"],
      [ "ç" , "c"],
      [ "ş" , "s"],
      [ "ı" , "i"],
      [ "ü" , "u"],
      [ "ö" , "o"],
      [ "ğ" , "g"],
    ]
  @replacements.each do |pair|
    slug.gsub!(pair[0], pair[1])
  end
  self.slug = slug.downcase
end

1
এত ডাউন ভোট কেন? আপনি কী ভুল করেছেন .. খুব বিস্তৃত হতে পারে
z

ওপি Öউদাহরণস্বরূপ অপসারণ করতে বলেনি ।
আইউলিয়ান ওনোফ্রেই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.