2009-12-04 1 views
22

Краткая версия - Как сделать Python rsplit() в ruby?Ruby: Разделить строку на символ, считая с правой стороны

Более длинная версия - если я хочу разбить строку на две части (имя, суффикс) в первой '.' характер, это делает работу хорошо:

name, suffix = name.split('.', 2) 

Но если я хочу, чтобы разделить на последний (крайний справа). " характер, я не был в состоянии придумать что-нибудь более элегантное, чем это:

idx = name.rindex('.') 
name, suffix = name[0..idx-1], name[idx+1..-1] if idx 

Обратите внимание, что исходная строка имени не может иметь точку на всех, в которых имя случае должно быть нетронутым и суффикс должен быть ноль; он может также иметь более одной точки, и в этом случае только суффикс после окончательного должен быть суффиксом.

ответ

41

String#rpartition делает только что:

name, match, suffix = name.rpartition('.') 

Он был введен в Руби 1.8.7, так что, если используете более раннюю версию, которую вы можете использовать для require 'backports/1.8.7/string/rpartition' что работать.

+1

Спасибо! Строка # rpartition также присутствует в Ruby 1.8.7. – alberge

+0

@alberge: Действительно, я исправил свой ответ. Благодаря! –

0

если это = "what.to.do" вы можете сделать это:

this.split(%r{(.+)\.}) 

, и вы получите обратно

["", "what.to", "do"] 
+0

Пустой элемент немного раздражает, и вы не можете вставить [1..2] в конец, чтобы исправить его, так как «whattodo» .split (% r {(. +) \.}) Возвращает ["что делать"]. – jpatokal

0

Если вы хотите буквальный версию rsplit, вы можете сделать это (отчасти это шутка, но на самом деле хорошо работает):

"what.to.do".reverse.split('.', 2).map(&:reverse).reverse 
=> ["what.to", "do"] 
+0

круто! но я могу сделать this.split (% r {(. +) \.}) [1,2], который дает результат sme – ennuikiller

+0

, действительно существует множество способов. – Peter

2

Вот что я на самом деле:

/(.*)\.(.*)/.match("what.to.do")[1..2] 
=> ["what.to", "do"] 

или, возможно, более традиционно,

s = "what.to.do" 

s.match(/(.*)\.(.*)/)[1..2] 
=> ["what.to", "do"] 
+1

Согласен, но я предполагал, что он хочет решения с split :) – ennuikiller

+0

Иначе приятно, но не получается, когда s не содержит точки. – jpatokal

5

Надень мыслящего колпачок на некоторое время и придумал это регулярное выражение:

"what.to.do.now".split(/\.([^.]*)$/) 
=> ["what.to.do", "now"] 

Или в человеческих терминах «раскол в точке, за которым не следует другая точка, в конце строки ". Работает хорошо и с Dotless строк и последовательностей точек:

"whattodonow".split(/\.([^.]*)$/) 
=> ["whattodonow"] 
"what.to.do...now".split(/\.([^.]*)$/) 
=> ["what.to.do..", "now"]