2010-02-01 4 views
81

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

ending = string[-n..-1] 

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

Какие возможные способы устранения?

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

ответ

81

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

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

Для рубина 1.9+

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

Для рубина 2.0+, присоединиться возвращает строка

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

Если вы используете последнюю версию Ruby, вы можете использовать 'chars' вместо split. –

+0

это не работает с 1.9. Другой ответ, похоже. – rogerdpack

+1

Я использовал «12345678910» .split (//). Last (7) .join.to_s –

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

Это лучший подход, который я вижу на этой странице, которая удовлетворяет требованиям, чтобы быть в состоянии поставить конечную длину символа что превышает общую длину строки. –

+0

Например, если вы намерены взять последние 3 символа группы укусов, таких как «abcde», «ab» и «a». Этот метод приведет к «cde», «ab» и «a», используя один и тот же код для каждого. '' abcde ".reverse [0,3] .reverse' >>>" cde "' "ab" .reverse [0,3] .reverse' >>> "ab" '" a ".reverse [0, 3] .reverse' >>> "a" –

93

Ну, самый простой обходной путь я могу думать:

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

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

+0

+1 ... Я думаю, что этот способ легче читать, чем 'string.reverse [0..n] .reverse', который дает мне вторую часть« wait, why он это делает? (или если бы я не читал его в контексте этого вопроса) – Arkaaito

+0

Гораздо проще, чем мое регулярное выражение. – EmFi

+4

Хороший ответ, но он должен быть '||' вместо 'or' или поставить круглые скобки вокруг' str [-n ..- 1] или str'. –

5

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

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

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

8

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

a [-n, n], если a - массив.

Вот и пример, если вы захотите.

рубинового-1.9.2-p180: 006> а = "911234567890"

=> "911234567890"

рубинового-1.9.2-p180: 009> а [-5,5]

=> "67890"

рубинового-1.9.2-p180: 010> а [-7,7]

=> "4567890"

+0

Если число слишком велико, возвращается «nil», чего конкретно пытался избежать этот вопрос. –

+0

Хороший ответ. Clean. – Volte

1

Impr оглашение ответа EmFi.

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

В прямой 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" 
+0

Лучший. Благодарю. –

+0

Ruby не подразумевает Rails. – Volte

7

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

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

только код - ответы не всегда полезны. объясняя, почему/как этот код является исправлением, было бы замечательно – ry8806

Смежные вопросы