ルビ文字列から最後のn文字を抽出する


105

n文字列から最後の文字を取得するために、私はあなたが

ending = string[-n..-1]

ただし、文字列がn文字よりも短い場合は、になりnilます。

どのような回避策がありますか?

背景:文字列はプレーンASCIIであり、ruby 1.9.1にアクセスできます。プレーンオールドRubyオブジェクト(Webフレームワークなし)を使用しています。

回答:


99

ここにあなたは1つのライナーを持っています、あなたは文字列のサイズより大きい数を置くことができます:

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

Ruby 1.9以降

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

Ruby 2.0以降の場合、joinは文字列を返します

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

19
Rubyの最新バージョンを使用している場合charsは、分割の代わりに使用できます。
Andrew Grimm、

1
「12345678910」を使用しました。split(//)。last(7).join.to_s
Hard-Boiled Wonderland

@ Hard-BoiledWonderlandはjoin機能します。to_sジョインを使うなら、最後は必要ないと思います。
アンドリューグリム

@AndrewGrimmその通りです。その場合、上記n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_iのNokogiriを使用しました。数値を抽出するためにto_sを実行するためにto_sが必要でした。
ハードボイルドワンダーランド

.joinがありませ -文字列の配列を返します。代わりに"123".split(//).last(5).join(Ruby 2.0.0)
Pavel Nikolov 2013

115

まあ、私が考えることができる最も簡単な回避策は:

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

(編集:or演算子の優先順位は代入よりも低いため、||代わりに使用してください。)


+1 ...この方法はに比べて読みやすいと思います。これstring.reverse[0..n].reverseにより、「待って、なぜ彼はそれをしているのですか?」(または、この質問の文脈で読んでいなかった場合)
Arkaaito

4
良い答えですが、||ではなく、orかっこで囲んでくださいstr[-n..-1] or str
Andrew Grimm

良い答えですが、ルビーがs [-inf ..- 1]をx [0..inf]と同じように扱わないのは好きではありません
klochner

演算子の優先順位の問題を指摘してくれてありがとう、Andrew。毎回私を迎えます。
perimosocordiae 2010

@perimosocordiaeあなただけではありません。stackoverflow.com/questions/372652/...
アンドリューグリム

51

ストレートRuby(Railsなし)では、次のことができます

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"

Ruby on Railsを使用している場合は、メソッドfirstlast文字列オブジェクトを呼び出すことができます。これらの方法は、簡潔で直感的であるため、推奨されます。

例えば:

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

1
RubyはRailsを意味しません。
Volte

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

これは、このページで私が見る最良の方法であり、文字列の合計の長さを超える終了文字の長さを提供できるという要件を満たしています。
Rob.Kachmar 2013

1
たとえば、「abcde」、「ab」、「a」などの文字列のグループの最後の3文字を取得する場合。この手法では、 "cde"、 "ab"、および "a"がそれぞれ同じコードを使用します。 "abcde".reverse[0,3].reverse>>> "cde" "ab".reverse[0,3].reverse>>> "ab" "a".reverse[0,3].reverse>>> "a"
Rob.Kachmar 2013

9

次のコードを使用できます。

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

1
コードのみ-回答が必ずしも役立つとは限りません。このコードが修正された理由/方法を説明するのはすばらしいでしょう
ry8806

6

文字列から最後のn文字を取得するには、次のようにします

a [-n、n](aが配列の場合)。

これが必要な場合の例です。

ruby-1.9.2-p180:006> a = "911234567890"

=> "911234567890"

ruby-1.9.2-p180:009> a [-5,5]

=> "67890"

ruby-1.9.2-p180:010> a [-7,7]

=> "4567890"


数値が大きすぎる場合は、nilが返されます。これは、この質問が特に回避しようとしていたものです。
Andrew Grimm

いい答えだ。掃除。
Volte

なぜこれが賛成票を得ているのですか?これには、OPが修正方法を尋ねたのとまったく同じ問題があります。
jeffdill2

5

あなたは正規表現を試しましたか?

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

正規表現は、文字列の末尾にある文字をすべてキャプチャしますが、n以下です。そして、それを$ 1に保管します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.