2009-12-04 30 views
22

Phiên bản ngắn - Làm thế nào để tôi làm Python rsplit() trong ruby?Ruby: Chia chuỗi ký tự, đếm từ bên phải

Phiên bản dài hơn - Nếu tôi muốn chia chuỗi thành hai phần (tên, hậu tố) ở đầu tiên '.' nhân vật, điều này không được công việc độc đáo:

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

Nhưng nếu tôi muốn chia tại cuối cùng (bìa phải) '' nhân vật, tôi đã không thể đưa ra bất cứ điều gì hơn nữa tao nhã hơn thế này:

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

Lưu ý rằng chuỗi tên gốc có thể không có một dấu chấm ở tất cả, trong đó tên trường hợp nên không bị ảnh hưởng và hậu tố nên không; nó cũng có thể có nhiều hơn một dấu chấm, trong trường hợp này chỉ một chút sau dấu chấm cuối cùng sẽ là hậu tố.

Trả lời

41

String#rpartition không chỉ rằng:

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

Nó đã được giới thiệu trong Ruby 1.8.7, vì vậy nếu chạy một phiên bản trước đó bạn có thể sử dụng require 'backports/1.8.7/string/rpartition' cho để làm việc.

+1

Cảm ơn! Chuỗi # rpartition cũng có mặt trong Ruby 1.8.7. – alberge

+0

@alberge: Thật vậy, tôi đã sửa câu trả lời của mình. Cảm ơn! –

0

nếu điều này = "what.to.do" bạn có thể làm điều này:

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

và bạn sẽ liên hệ lại

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

Phần tử trống có một chút phiền toái và bạn không thể dán [1..2] ở cuối để sửa lỗi, vì "whattodo" .split (% r {(. +) \.}) Trả về ["whattodo"]. – jpatokal

0

Nếu bạn muốn phiên bản đen của rsplit, bạn có thể làm điều này (đây là một phần trò đùa, nhưng thực sự hoạt động tốt):

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

tuyệt! nhưng tôi có thể làm điều này.split (% r {(. +) \.}) [1,2] cho kết quả sme – ennuikiller

+0

thực sự có rất nhiều cách. – Peter

2

Đây là những gì tôi thực sự làm:

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

hoặc có lẽ thông thường hơn,

s = "what.to.do" 

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

Tôi đồng ý nhưng tôi cho rằng anh ấy muốn có giải pháp chia tách :) – ennuikiller

+0

Nếu không, nhưng không thành công khi s không chứa dấu chấm. – jpatokal

5

Đặt trên nắp suy nghĩ một lúc và đã đưa ra regexp này:

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

Hoặc về con người "chia ở dấu chấm, không theo sau bởi một dấu chấm khác, ở cuối chuỗi ". Hoạt động độc đáo cũng với chuỗi dotless và trình tự chấm:

"whattodonow".split(/\.([^.]*)$/) 
=> ["whattodonow"] 
"what.to.do...now".split(/\.([^.]*)$/) 
=> ["what.to.do..", "now"] 
Các vấn đề liên quan