রুবি, একটি স্ট্রিং থেকে শেষ এন অক্ষর মুছবেন?


263

কোন nস্ট্রিং থেকে শেষ অক্ষরগুলি সরানোর পছন্দের উপায়টি কী ?


যদি আপনি প্রত্যয়টি জানেন (শীর্ষের উত্তর এটির সন্ধানের জন্য এখানে প্রচুর আসার পরামর্শ দেয়), আপনি delete_suffixরুবি 2.5 থেকে ব্যবহার করতে পারেন । আরও তথ্য এখানে
এসআরাক

উত্তর:


36

রুবি 2.5+

রুবি 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)

আমি আশা করি এটি কার্যকর হয়েছে - নোটটি পদ্ধতিটি বর্তমানে একটি রেজেক্স গ্রহণ করে না তাই আপনি যদি প্রত্যয়টি জানেন না তবে এটি আপাতত কার্যকর নয়। যাইহোক, গৃহীত উত্তর ( আপডেট: লেখার সময় ) একই নির্দেশ করে, আমি ভেবেছিলাম এটি কিছু লোকের পক্ষে দরকারী।


1
@ JPSilvashy আমি কখনও চেকমার্ক হারিয়ে বেশি খুশি হইনি। এটি একটি দুর্দান্ত উত্তর।
ওয়েন কনরাড

1
এটি একটি দুর্দান্ত এবং দ্রুত ফাংশন, তবে এটি সঠিক উত্তর নয় কারণ এটি যে প্রশ্নের সঠিক উত্তর দেয় নাWhat is the preferred way of removing the last n characters from a string?
স্যাম

1
@ সামের প্রতিক্রিয়াটির জন্য ধন্যবাদ - লেখার সময় ২1১ টি উর্ধ্বে থাকা এই প্রশ্নের উত্তর প্রায় নয় বছর ধরে এই উত্তরটির মতো হয়েছিল। জেপি তা গ্রহণ করেছে এবং সম্প্রতি এটিতে সরে গেছে, তাই আমি বলব এটি তাদের প্রশ্নের জবাব দিয়েছে :) আমি ভেবেছিলাম এটি একটি আধুনিক বিকল্প হিসাবে পপ করব, এবং আশা করি এটি এখানে যারা অবতরণ করেছে তাদের সহায়তা করবে। আসলে, আমি এই সমস্ত প্রশ্নটি coveredেকে রেখেছি - আমি আশা করছি যে এই পদ্ধতিটি খুব শীঘ্রই একটি রেজেক্স গ্রহণ করবে, যদিও এর নীচে আপনার মামলার উপযুক্ত বিকল্প রয়েছে।
এসআরাক

316
irb> 'now is the time'[0...-4]
=> "now is the "

9
মনে রাখবেন এটি কেবল রুবি ১.৯ এ কাজ করে। রুবি ১.৮-এ, এটি শেষ অক্ষরগুলি নয়, শেষ বাইটগুলি সরিয়ে ফেলবে ।
Jörg ডব্লু মিট্টাগ

2
তবে তিনি সম্ভবত "বাইটস" বোঝালেন যদি তিনি 1.8.x ব্যবহার করেন is
ডিজিটালরোস

4
এটি কাজ করে, তবে আমি 'abc123'.chomp (' 123 ') উভয় সংক্ষিপ্ত এবং খুব দীর্ঘ উভয় স্ট্রিংয়ের জন্য দ্বিগুণ দ্রুত হতে সন্ধান করছি। (রুবি ২.০.০-পি ২77) কেউ কি এটি নিশ্চিত করতে পারে?
প্লাজমারব

10
তাদের জন্য কেন এই নির্দিষ্ট উদাহরণটি কার্যকর হয় না তা ভাবছেন here এখানে 3 বিন্দু নয় 2 [0...-4]নয়[0..-4]
রোরোফ্রান্সফ্রান্স

2
@ প্লামারোব আমি মনে করি যে এটি চম্পের চেয়ে দ্বিগুণ দ্রুত গতির চেয়ে 53 ন্যানো সেকেন্ডের চেয়ে বেশি গতিযুক্ত বলা আরও প্রাসঙ্গিক। তারপরে আপনি এটি ব্যবহারের ব্যয়ের তুলনায় মূল্য সম্পর্কে আরও ভালভাবে অনুমান করতে পারেন এবং প্রদত্ত পরিস্থিতিতে এটি অনুকূলিতকরণের জিনিস হতে পারে কিনা।
সিএসয়েড

266

আপনি যে অক্ষরগুলি মুছতে চান তা যদি সর্বদা একই অক্ষর হয় তবে বিবেচনা করুন chomp:

'abc123'.chomp('123')    # => "abc"

এর সুবিধাগুলি chompহ'ল: গণনা নেই এবং কোডটি কী করছে তা আরও স্পষ্টভাবে জানিয়ে দেয় ic

কোনও যুক্তি ছাড়াই 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)

সুতরাং chomp একটি ব্যাপ্তি ব্যবহারের চেয়ে 22% বেশি দ্রুত হয়।


5
চপ এছাড়াও একটি বিকল্প। কী সরানো হবে সে সম্পর্কে কম উদ্বেগজনক।
অ্যান্ড্রু গ্রিম

1
আমি দেখতে পেয়েছি বিপরীতটি আসলে সত্য true বাস্তবতা হ'ল .চম্প ধারাবাহিকভাবে দ্বিগুণ দ্রুত বলে মনে হয়।
প্লাজমারব

3
@ প্লামারব, রুবির বেঞ্চমার্কগুলি প্রায়শই অবাক হয়। আমি প্রায়শই ভুল হয়ে পড়েছি যে আমি আর কী হবে তা অনুমান করার চেষ্টা করি না। এছাড়াও, যদি উত্তরটি মানদণ্ডের ফলাফলের দ্বারা উন্নত হয় তবে দয়া করে এটি সম্পাদনা করতে দ্বিধা বোধ করবেন।
ওয়েইন কনরাড

1
আমি যদি কোডটি সঠিকভাবে পড়ছি তবে পরিসরটি শম্পের চেয়ে প্রায় 53 ন্যানোসেকেন্ডের বেশি সময় নেয়। এটি নির্দিষ্ট পরিস্থিতিতে একটি তাৎপর্যপূর্ণ টান হতে পারে, তবে নিখুঁত গতিটি মাথায় রেখে (কেবলমাত্র আপেক্ষিকের তুলনায়) আপনাকে বলতে পারে যে আপনার কোডবেসটি ব্যবহার করে আপনার সমস্ত রেঞ্জকে চম্পসে পরিবর্তন করা উচিত (যেখানে প্রযোজ্য)। সম্ভবত না.
সিসয়েড

1
দুর্দান্ত কাজ করে। এবং আপনি chomp!()জায়গায় জায়গায় স্ট্রিংয়ের কাজ করতে ব্যবহার করতে পারেন ।
জোশুয়া পিন্টার

57
str = str[0...-n]

5
মনে রাখবেন এটি কেবল রুবি ১.৯ এ কাজ করে। রুবি ১.৮-এ, এটি শেষ অক্ষরগুলি নয়, শেষ বাইটগুলি সরিয়ে ফেলবে ।
Jörg W Mittag

5
এটি নির্বাচিত উত্তরের চেয়ে ভাল, যেহেতু 3 বিন্দু (...) মুখস্থ করা সহজ কারণ -n মানে স্ট্রিংয়ের শেষে থেকে অক্ষর বের করা।
লুলালালা

এছাড়াও "abcd" [0 ..- 2] # => "abc" যখন "abcd" [0 ...- 2] # => "আব"। আমার মতে 3 ডটস রেঞ্জ বিকল্পের ফলে আরও বেশি স্ব-বর্ণনামূলক কোড আসে in
মোকাগিও

31

আমি পরামর্শ দেব chop। আমি মনে করি এটির একটি মন্তব্যে এটি উল্লেখ করা হয়েছে তবে লিঙ্ক বা ব্যাখ্যা ছাড়াই এখানে কেন আমি আরও ভাল বলে মনে করি:

এটি কেবল স্ট্রিং থেকে শেষ চরিত্রটি সরিয়ে দেয় এবং এটি হওয়ার জন্য আপনাকে কোনও মান নির্দিষ্ট করতে হবে না।

যদি আপনার একাধিক চরিত্র অপসারণ করতে হয় তবে chompআপনার সেরা বাজি। এই কি রুবি ডক্স সম্পর্কে কী বলার আছে chop:

শেষ অক্ষরটি সরিয়ে একটি নতুন স্ট্রিং ফেরত দেয়। যদি স্ট্রিংটি \ r \ n দিয়ে শেষ হয় তবে উভয় অক্ষর সরানো হবে। একটি খালি স্ট্রিং চপ প্রয়োগ একটি খালি স্ট্রিং ফিরে। স্ট্রিং # Chomp প্রায়শই একটি নিরাপদ বিকল্প, কারণ এটি রেকর্ড পৃথক পৃথক স্থানে শেষ না হলে স্ট্রিংটি অপরিবর্তিত রাখে।

যদিও এটি বেশিরভাগ বিভাজকগুলি অপসারণ করতে ব্যবহৃত হয় যেমন \r\nআমি একটি সাধারণ স্ট্রিং থেকে শেষ চরিত্রটি সরিয়ে ফেলতে এটি ব্যবহার করেছি, উদাহরণস্বরূপ sশব্দটি একবচন করার জন্য।


1
এটি কি কেবল সেই একক শেষ চরিত্রটিকে সরাবে না? প্রশ্নটি বহুবচন "চরিত্রগুলি" সম্পর্কে
হস্তান্তর

1
হ্যাঁ, আপনি ঠিক বলেছেন, তবে চম্প ('অক্ষর') শেষের 'অক্ষর' সরিয়ে দেবে। ওপি নির্দিষ্ট অক্ষর বা শুধু এন অক্ষর চায় কিনা তা আমার কাছে পরিষ্কার ছিল না।
কাকুবেই

হ্যাঁ, এটি উত্তর, যখন আপনি কেবলমাত্র একটি চরিত্র মুছতে চান (যদিও আমার ক্ষেত্রে এটি ছিল)।
Quv

29
name = "my text"
x.times do name.chop! end

কনসোলে এখানে:

>name = "Nabucodonosor"
 => "Nabucodonosor" 
> 7.times do name.chop! end
 => 7 
> name
 => "Nabuco" 

এটা কি দক্ষ? অন্যান্য উত্তরের তুলনায় একটি মানদণ্ডের মূল্য মনে হচ্ছে :)
এসআরকে

16

শেষ 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"

7

আপনি যদি রেল ব্যবহার করছেন, চেষ্টা করুন:

"my_string".last(2) # => "ng"

[সম্পাদনা]

শেষ 2 টি অক্ষর ছাড়া স্ট্রিংটি পেতে:

n = "my_string".size
"my_string"[0..n-3] # => "my_stri"

দ্রষ্টব্য: শেষ স্ট্রিং চরটি এন -1 এ রয়েছে। সুতরাং, শেষ 2 অপসারণ করতে, আমরা এন -3 ব্যবহার করি।


2
এটি শেষ দুটি অক্ষর সরিয়ে দেয় না। এটি তাদের ফেরত দেয়।
জেপি সিলভাশি

1
আপনাকে প্রথমে স্ট্রিংটি পরিমাপ করার দরকার নেই, রুবি স্থানীয়ভাবে স্ট্রিংয়ের শেষে থেকে নেতিবাচক সূচী ব্যবহার করে
ডিভন পার্সসন

3

আপনি সর্বদা এরকম কিছু ব্যবহার করতে পারেন

 "string".sub!(/.{X}$/,'')

Xঅক্ষরের সংখ্যা কোথায় সরানো হবে।

অথবা ফলাফল নির্ধারণ / ব্যবহার করে:

myvar = "string"[0..-X]

যেখানে Xঅক্ষরের সংখ্যা প্লাস এক মুছে ফেলার জন্য।



1

আপনি যদি শ্রেণিবদ্ধ পদ্ধতি তৈরির ক্ষেত্রে ঠিক থাকেন এবং যে অক্ষরগুলি কেটে ফেলতে চান তা চাইলে এটি চেষ্টা করুন:

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'


0

আপনি যে অক্ষরগুলি মুছতে চান তা যদি সর্বদা একই অক্ষর হয় তবে chomp বিবেচনা করুন:

'abc123'। ছম্প ('123')


-3
x = "my_test"
last_char = x.split('').last

3
প্রশ্নটি সর্বশেষ এন অক্ষরগুলি একটি স্ট্রিং থেকে অপসারণ সম্পর্কে ছিল, শেষ চরিত্রটি খুঁজে পাওয়ার বিষয়ে নয়
আননিটলম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.