Витяг останніх n символів з рядка рубіна


105

Щоб отримати останні nсимволи з рядка, я припускав, що ви можете використовувати

ending = string[-n..-1]

але якщо рядок менше nбукв, ви отримаєте nil.

Які обхідні шляхи доступні?

Передумови : Рядки є простими ASCII, і у мене є доступ до ruby ​​1.9.1, і я використовую Plain Old Ruby Objects (немає веб-рамок).

Відповіді:


99

Тут у вас є один вкладиш, ви можете поставити число, що перевищує розмір рядка:

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

Для рубіну 1.9+

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

Для ruby ​​2.0+, join повертає рядок

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

19
Якщо ви використовуєте останню версію Ruby, ви можете використовувати charsзамість спліт.
Ендрю Грімм

1
Я використав "12345678910" .split (//). Last (7) .join.to_s
Жорстко

@ Твердо вареніWonderland joinпрацює. Я не думаю, що вам потрібен останній, to_sякщо ви використовуєте приєднатися.
Ендрю Грімм

@AndrewGrimm Ви маєте рацію, для цього випадку я використовував вище з Nokogiri, n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_iмені знадобилося to_s для виконання to_i для отримання числового значення.
Твердо варена країна чудес

Ви відсутній .join - тепер він повертає масив рядків. Натомість має бути "123".split(//).last(5).join(Ruby 2.0.0)
Павло Ніколов

115

Що ж, найпростіший спосіб, який я можу придумати, це:

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

(EDIT: orОператор має нижчий пріоритет, ніж присвоєння, тому обов'язково використовуйте ||замість цього.)


+1 ... Я думаю, що цей спосіб читати простіше, ніж це string.reverse[0..n].reverse, що дає мені секунду "зачекай, чому він це робить?" (або, якби я не читав цього в контексті цього питання)
Аркаїто

4
Хороша відповідь, але це має бути ||замість orабо ставити круглі дужки навколо str[-n..-1] or str.
Ендрю Грімм

Хороша відповідь, але мені не подобається, що рубін не відноситься до s [-inf ..- 1] так само, як до x [0..inf]
klochner

Дякуємо, що відзначили питання пріоритетності оператора, Ендрю. Збирає мене щоразу.
perimosocordiae

@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, ви можете викликати методи 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
Наприклад, якщо ви маєте намір взяти останні три символи групи укусів, таких як "abcde", "ab" та "a". Ця методика призведе до "cde", "ab" та "a", використовуючи один і той же код для кожного. "abcde".reverse[0,3].reverse>>> "cde" "ab".reverse[0,3].reverse>>> "ab" "a".reverse[0,3].reverse>>> "a"
Rob.Kachmar

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повертається, саме цього питання спеціально намагалися уникнути.
Ендрю Грімм

Хороша відповідь. Чисто.
Вольте

Чому це отримання виплат? Це точно така ж проблема, як і те, що ОП запитувало, як виправити.
jeffdill2

5

Ви пробували регулярний вираз?

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

Згенероскопія фіксує стільки символів, скільки може в кінці рядка, але не більше n. І зберігає його в $ 1.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.