例如,我有一些随机字符串:
str = "26723462345"
我希望在第6个字符之后分成两部分。如何正确地做到这一点?
谢谢!
答案 0 :(得分:31)
这应该这样做
[str[0..5], str[6..-1]]
或
[str.slice(0..5), str.slice(6..-1)]
答案 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)
_, part1, part2 = str.partition /.{6}/
https://ruby-doc.org/core-1.9.3/String.html#method-i-partition
答案 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"
它还会保留原始字符串,这可能会在程序的后期派上用场。