Извлечение последних n символов из строки ruby

Чтобы получить последние n символы из строки, я предположил, что вы можете использовать

ending = string[-n..-1]

но если длина строки меньше n длинных букв, вы получите nil.

Какие способы обхода доступны?

Фон. Строки - это простой ASCII, и у меня есть доступ к ruby ​​1.9.1, и я использую Plain Old Ruby Objects (без веб-фреймворков).

Ответ 1

Здесь у вас есть один вкладыш, вы можете поместить число больше размера строки:

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

Для ruby ​​1.9 +

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

Для ruby ​​2.0+ объединение возвращает строку

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

Ответ 2

Ну, самое легкое обходное решение, о котором я могу думать:

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

(EDIT: оператор or имеет более низкий приоритет, чем назначение, поэтому используйте || вместо этого.)

Ответ 3

В прямом 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, вы можете вызывать методы first и last для строкового объекта. Эти методы предпочтительнее, поскольку они кратки и интуитивно понятны.

Например:

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

Ответ 4

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

Ответ 5

Чтобы получить последние 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"

Ответ 6

Вы можете использовать следующий код:

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

Ответ 7

Вы пробовали регулярное выражение?

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

Регулярное выражение захватывает как можно больше символов в конце строки, но не более n. И хранит его в $1.

Ответ 8

Улучшение ответа EmFi.

string[/.{,#{n}}\z/m]