簡體   English   中英

Ruby:在字符處拆分字符串,從右側開始計算

[英]Ruby: Split string at character, counting from the right side

簡短版 - 如何在ruby中使用Python rsplit()?

更長的版本 - 如果我想在第一個'。'將一個字符串拆分為兩個部分(名稱,后綴)。 性格,這很好地完成了工作:

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

但如果我想在最后 (最右邊)分開'。' 性格,我還沒有能夠提出比這更優雅的東西:

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

請注意,原始名稱字符串可能根本沒有點,在這種情況下,名稱應該是不變的,后綴應該是nil; 它也可能有一個以上的點,在這種情況下,只有最后一個后面的位應該是后綴。

String#rpartition就是這樣做的:

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

它是在Ruby 1.8.7中引入的,所以如果運行早期版本,你可以使用require 'backports/1.8.7/string/rpartition'來實現它。

戴上思考上限一段時間,想出了這個正則表達式:

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

或者用人的術語“在點上分開,而不是在字符串的末尾跟着另一個點”。 與無點字符串和點序列一起使用也很好:

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

這就是我實際做的事情:

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

或者更傳統的,

s = "what.to.do"

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

如果這=“what.to.do”你可以這樣做:

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

你會回來的

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

如果你想要rsplit的文字版本,你可以這樣做(這部分是一個笑話,但實際上效果很好):

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

您還可以通過在文件頂部添加rsplit將其添加到String類中。

class String
  def rsplit(pattern=nil, limit=nil)
    array = self.split(pattern)
    left = array[0...-limit].join(pattern)
    right_spits = array[-limit..]
    return [left] + right_spits
  end
end

它不像拆分那樣工作。 例如

$ pry
[1] pry(main)> s = "test.test.test"
=> "test.test.test"
[2] pry(main)> s.split('.', 1)
=> ["test.test.test"]
[3] pry(main)> s.split('.', 2)
=> ["test", "test.test"]
[4] pry(main)> s.split('.', 3)
=> ["test", "test", "test"]

[6] pry(main)> s
=> "test.test.test"
[7] pry(main)> s.rsplit('.', 1)
=> ["test.test", "test"]
[8] pry(main)> s.rsplit('.', 2)
=> ["test", "test", "test"]

但我無法弄清楚如何縮短它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM