রুবি স্ট্রিং থেকে শেষ এন অক্ষরগুলি বের করা


105

nএকটি স্ট্রিং থেকে শেষ অক্ষরগুলি পেতে , আমি ধরে নিয়েছি আপনি ব্যবহার করতে পারেন

ending = string[-n..-1]

তবে স্ট্রিং যদি nঅক্ষরের চেয়ে কম হয় তবে আপনি পাবেন nil

কি workaround উপলব্ধ?

পটভূমি : স্ট্রিংগুলি সরল ASCII, এবং আমার রুবি ১.৯.১ এ অ্যাক্সেস রয়েছে এবং আমি সরল পুরাতন রুবি অবজেক্ট (কোনও ওয়েব ফ্রেমওয়ার্ক) ব্যবহার করছি না।

উত্তর:


99

এখানে আপনার কাছে একটি লাইনার রয়েছে, আপনি স্ট্রিংয়ের আকারের চেয়ে বেশি নম্বর রাখতে পারেন:

"123".split(//).last(5).to_s

রুবি 1.9+ এর জন্য

"123".split(//).last(5).join("").to_s

রুবি ২.০+ এর জন্য যোগ দিন একটি স্ট্রিং returns

"123".split(//).last(5).join

19
আপনি যদি রুবির সাম্প্রতিক সংস্করণ ব্যবহার করছেন তবে আপনি charsবিভাজনের পরিবর্তে ব্যবহার করতে পারেন ।
অ্যান্ড্রু গ্রিম 21

1
আমি "12345678910" ব্যবহার করেছি .স্প্লিট (//)। সর্বশেষ (7)। Join.to_s
হার্ড-সেদ্ধ ওয়ান্ডারল্যান্ড

@ হার্ড-বোলেড ওয়ান্ডারল্যান্ড joinকাজ করে। আমি মনে করি না to_sআপনি যোগ দিন ব্যবহার করলে আপনার শেষের দরকার ।
অ্যান্ড্রু গ্রিম

@ অ্যান্ড্রুগ্রিম আপনি ঠিক বলেছেন, সেই ক্ষেত্রে আমি উপরেরটি নোকোগিরির সাথে ব্যবহার n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_iকরেছি সংখ্যার মানটি বের করার জন্য টো_আই সম্পাদনের জন্য আমার টো_স দরকার ছিল।
হার্ড-সেদ্ধ ওয়ান্ডারল্যান্ড

আপনি অনুপস্থিত .জয়িন - এখন এটি স্ট্রিংগুলির একটি অ্যারে প্রদান করে। পরিবর্তে এটি হওয়া উচিত "123".split(//).last(5).join(রুবি ২.০.০)
পাভেল নিকোলভ

115

ঠিক আছে, আমি ভাবতে পারি সবচেয়ে সহজ কাজটি হ'ল:

ending = str[-n..-1] || str

(সম্পাদনা: orঅপারেটরের অ্যাসাইনমেন্টের চেয়ে কম অগ্রাধিকার রয়েছে, তাই ||পরিবর্তে ব্যবহার করতে ভুলবেন না ))


+1 ... আমি মনে করি এইভাবে পড়া আরও সহজ string.reverse[0..n].reverse, যা আমাকে "অপেক্ষা কর, সে কেন করছে?" (বা যদি আমি এই প্রশ্নের প্রসঙ্গে এটি না
পড়ি

4
ভাল উত্তর, তবে এটির ||পরিবর্তে হওয়া উচিত or, বা চারপাশে বন্ধনী স্থাপন করা উচিত str[-n..-1] or str
অ্যান্ড্রু গ্রিম 1'10

উত্তম উত্তর, তবে আমি পছন্দ করি না যে রুবি এস [[ইনফ ..- 1] এর মতো x হিসাবে ব্যবহার করবে না [0..inf]
klochner

অপারেটর অগ্রাধিকার ইস্যুটি লক্ষ করার জন্য ধন্যবাদ, অ্যান্ড্রু। প্রতিবার আমাকে পায়।
পেরিমোসোকর্ডিয়া

আপনি কেবলমাত্র একজন নন stackoverflow.com/questions/372652/…
অ্যান্ড্রু গ্রিম

51

সোজা রুবিতে (বিনা ব্যতীত) আপনি এটি করতে পারেন

string.chars.last(n).join

উদাহরণ স্বরূপ:

2.4.1 :009 > a = 'abcdefghij'
 => "abcdefghij"
2.4.1 :010 > a.chars.last(5).join
 => "fghij"
2.4.1 :011 > a.chars.last(100).join
 => "abcdefghij"

আপনি যদি রুবেল অন রেল ব্যবহার করেন তবে আপনি পদ্ধতিগুলি firstএবং lastস্ট্রিং অবজেক্টে কল করতে পারেন । এই পদ্ধতিগুলি সংবেদনশীল এবং স্বজ্ঞাত হওয়ায় তাদের পছন্দ করা হয়।

উদাহরণ স্বরূপ:

[1] pry(main)> a = 'abcdefg'                                                                                                                
 => "abcdefg"
[2] pry(main)> a.first(3)                                                                                                                   
 => "abc"
[3] pry(main)> a.last(4)                                                                                                                    
 => "defg"

1
রুবি রেলগুলি বোঝায় না।
ভোল্ট

14
ending = string.reverse[0...n].reverse

এই পৃষ্ঠায় আমি দেখতে পেল এটি সর্বোত্তম পন্থা যা সম্পূর্ণ স্ট্রিংয়ের দৈর্ঘ্য ছাড়িয়ে এমন একটি শেষ চরিত্রের দৈর্ঘ্য সরবরাহ করতে সক্ষম হওয়ার প্রয়োজনীয়তাকে সন্তুষ্ট করে।
রব.কছমার

1
উদাহরণস্বরূপ, যদি আপনি "অ্যাবিসিডি", "আব", এবং "ক" এর মতো গোষ্ঠীর স্টিংসের শেষ 3 টি চরিত্রটি গ্রহণ করার ইচ্ছা পোষণ করেন। এই কৌশলটির ফলস্বরূপ "সিডি", "আব" এবং "এ" প্রত্যেকটির জন্য একই কোড ব্যবহার করা হবে। "abcde".reverse[0,3].reverse>>> "সিডি" "ab".reverse[0,3].reverse>>> "আব" "a".reverse[0,3].reverse>>> "এ"
রব.কমার

9

আপনি নিম্নলিখিত কোড ব্যবহার করতে পারেন:

string[string.length-n,string.length]

1
কেবল কোড - উত্তরগুলি সর্বদা সহায়ক হয় না। কেন / কীভাবে এই কোডটি ঠিক করা হয়েছে তা ব্যাখ্যা করা দুর্দান্ত হবে
ry8806

6

একটি স্ট্রিং থেকে শেষ এন অক্ষর পেতে, আপনি এটি করতে পারে

a [-n, n] যদি একটি অ্যারে হয়।

আপনি যদি চান তবে এখানে এবং উদাহরণস্বরূপ।

রুবি-1.9.2-p180: 006> এ = "911234567890"

=> "911234567890"

রুবি-1.9.2-p180: 009> এ [-5,5]

=> "67890"

রুবি-1.9.2-p180: 010> এ [-7,7]

=> "4567890"


যদি সংখ্যাটি খুব বেশি nilহয় তবে ফিরে আসে, যা এই প্রশ্নটি বিশেষত এড়াতে চাইছিল।
অ্যান্ড্রু গ্রিম

ভাল উত্তর. পরিষ্কার করুন।
ভোল্ট

কেন এই উপার্জন হচ্ছে? এটিতে ঠিক একই সমস্যা রয়েছে যেটি ওপি কীভাবে ঠিক করতে চেয়েছিল।
jeffdill2

5

আপনি কি একটি রেজেক্স চেষ্টা করেছেন?

string.match(/(.{0,#{n}}$)/)
ending=$1

রেজেক্স স্ট্রিংয়ের শেষে যতগুলি অক্ষর পারে তা ক্যাপচার করে, তবে n এর চেয়ে বেশি নয়। এবং এটি $ 1 এ সঞ্চয় করে।


1

এমফির উত্তরের উন্নতি।

string[/.{,#{n}}\z/m]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.