2009-12-04 11 views
22

ショートバージョン - RubyでPython rsplit()をどうやって行うのですか?Ruby:文字を分割して文字列を右から数えて

長いバージョン - 文字列を最初の '。'で2つの部分(名前、サフィックス)に分割したい場合。

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

をしかし、私は最後(右端)で分割したい場合:文字、これはうまく仕事をしていません「」文字、私はこれよりもよりエレガントなものを思い付くことができていない:

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

ケース名はそのままであるべきで、サフィックスがあるべきで、元の名前の文字列が全くドットを持たないかもしれないことに注意してください、 nil; 2つ以上のドットを持つこともできます。最後のドットの後のビットのみが接尾辞でなければなりません。あなたができる、

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

、あなたがrsplitのリテラルバージョンをしたい場合は、バック

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

答えて

41

String#rpartitionはまさにそれを行います。

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

これは、Rubyの1.8.7で導入されましたので、以前のバージョンを実行している場合は、あなたがのためにrequire 'backports/1.8.7/string/rpartition'を使用することができますそれは働くこと。

+1

ありがとう! String#rpartitionはRuby 1.8.7にも含まれています。 – alberge

+0

@alberge:確かに、私は答えを決めました。ありがとう! –

0

"what.to.do" あなたはこれを行うことができます(これは一部冗談ですが、実際にはうまく動作します)、この操作を行います。ここでは

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

空の要素はちょっと迷惑ですが、 "whattodo" .split(%r {(。+)\。})が返すので、[1..2]を最後に貼り付けることはできません。 ["何をすべきか"]。 – jpatokal

0

を取得します:これはIF =

+0

cool!私はこれを行うことができます。スリップ(%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

私は同意しますが、私は彼が分割を使って解決策を望んでいると思っていました:) – ennuikiller

+0

それ以外の点ではいいですが、sにドットが含まれていないと失敗します。 – jpatokal

5

はしばらくの間、思考のキャップに入れて、この正規表現を思い付いた:ドットで分割」

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

それとも人間の言葉では、文字列の終わりに別のドットが続くことはありません "。ドットのドットなしの文字列と配列ともうまく動作します:

"whattodonow".split(/\.([^.]*)$/) 
=> ["whattodonow"] 
"what.to.do...now".split(/\.([^.]*)$/) 
=> ["what.to.do..", "now"] 
関連する問題