如何在一定位置后将字符串拆分为2个部分

时间:2011-10-06 09:29:57

标签: ruby-on-rails ruby

例如,我有一些随机字符串:

str = "26723462345"

我希望在第6个字符之后分成两部分。如何正确地做到这一点?

谢谢!

6 个答案:

答案 0 :(得分:31)

这应该这样做

[str[0..5], str[6..-1]]

 [str.slice(0..5), str.slice(6..-1)]

真的应该看看http://corelib.rubyonrails.org/classes/String.html

答案 1 :(得分:11)

这是选项。但请注意,它会改变原始字符串:

part1, part2 = str.slice!(0...6), str

p part1  # => "267234"
p part2  # => "62345"
p str    # => "62345"

更新

自从我写这篇答案以来的几年里,我已经同意评论者抱怨它可能过于聪明。以下是一些不会改变原始字符串的其他选项。

警告:这个只适用于ASCII字符。

str.unpack("a6a*")
# => ["267234", "62345"]

下一个使用魔术变量$',它在最近的Regexp匹配后返回字符串的一部分:

part1, part2 = str[/.{6}/], $'
p [part1, part2]
# => ["267234", "62345"]

最后一个使用lookbehind将字符串分割到正确的位置,而不返回任何额外的部分:

p str.split(/(?<=^.{6})/)
# => ["267234", "62345"]

答案 2 :(得分:4)

答案 3 :(得分:3)

IMO的最佳方式是string.scan(/.{6}/)

irb(main)> str
=> "abcdefghijklmnopqrstuvwxyz"
irb(main)> str.scan(/.{13}/)
=> ["abcdefghijklm", "nopqrstuvwxyz"]

答案 4 :(得分:1)

作为一个有趣的答案,如何:

str.split(/(^.{1,6})/)[1..-1]

这是有效的,因为除了正则表达式之前和之后的字符串部分之外,split还返回捕获组匹配。

答案 5 :(得分:0)

以下是适合您的可重用版本:

str       = "26723462345"
n         = str.length
boundary  = 6
head      = str.slice(0, boundary) # => "267234" 
tail      = str.slice(boundary, n) # => "62345" 

它还会保留原始字符串,这可能会在程序的后期派上用场。