如果我有一个类似下面的字符串,我将如何在每个第3个字符或任何其他指定字符处拆分它?
b = "123456789"
结果将是:
b = ["123","456","789"]
我尝试过使用这些方法:b.split("").each_slice(3).to_a
但结果如下:[["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]]
感谢您的帮助!
答案 0 :(得分:6)
b = "123456789"
b.chars.each_slice(3).map(&:join)
# => ["123", "456", "789"]
答案 1 :(得分:6)
我会用:
b = "123456789"
b.scan(/.{3}/) # => ["123", "456", "789"]
如果OP的样本长度不同,或者嵌入了“\ n”,则可以进行简单的修改:
b = "123456789"
b.scan(/.{1,3}/) # => ["123", "456", "789"]
b[0..-2].scan(/.{1,3}/) # => ["123", "456", "78"]
"#{ b }\n#{ b }".scan(/.{1,3}/) # => ["123", "456", "789", "123", "456", "789"]
现在,如果在“3”边界上有一个嵌入的“\ n”NOT,它会断开:
"#{ b[0..-2] }\n#{ b }".scan(/.{1,3}/) # => ["123", "456", "78", "123", "456", "789"]
但是从OP的简单规范开始走得相当远,可以通过首先剥离新线来修复:
"#{ b[0..-2] }\n#{ b }".delete("\n").scan(/.{1,3}/) # => ["123", "456", "781", "234", "567", "89"]
答案 2 :(得分:5)
你几乎成功了。
b = "123456789"
b.split("").each_slice(3).map(&:join) # => ["123", "456", "789"]
答案 3 :(得分:5)
另一种方式:
my_s, my_a = '123456789', []
my_a << my_s.slice!(0..2) until my_s.empty?
p my_a # => ["123", "456", "789"]
答案 4 :(得分:2)
这不会创建临时数组,适用于任何集合和字符数,并且不使用慢速正则表达式。虽然不那么优雅。
s = "1234567"
(0...s.size / 3).map { |i| s[i * 3, 3] }
# => ["123", "456", "7"]
<强>基准:强>
require "benchmark"
N = 100000
Benchmark.bm do |x|
b = "123456789"
x.report { N.times { (0...b.size / 3).map { |i| b[i * 3, 3] } } }
x.report { N.times { b.scan(/.{3}/) } }
x.report { N.times { b.chars.each_slice(3).map(&:join) } }
x.report { N.times { b.split("").each_slice(3).map(&:join) } }
end
结果:
$ ruby split3.rb
user system total real
0.080000 0.000000 0.080000 ( 0.079944)
0.130000 0.000000 0.130000 ( 0.127715)
0.300000 0.000000 0.300000 ( 0.299186)
0.640000 0.000000 0.640000 ( 0.641817)
我试图改变线条的顺序,看看是否有任何奇怪的副作用。结果是一致的。订单无关紧要。
答案 5 :(得分:2)
除了其他答案之外,如果你想分割任意一组字符(这个答案并不涵盖每个第三个字符,因为已经有足够多的答案了)并决定在哪里分裂字符去,你也可以像split
一样使用:
# Split and include splitting character in next slice
"123456789".split(/(?=[36])/) # => ["12", "345", "6789"]
# Split and include splitting character in slice
"123456789".split(/(?<=[36])/) # => ["123", "456", "789"]
# Split and exclude character from slices
"123456789".split(/[36]/) # => ["12", "45", "789"]
请记住, 使用正则表达式,为了您的目的,最好找到一种方法来使用较少的over-the-top路线来分割字符串(请参阅detunized的答案) ,这是相当简洁和合理的处理方式)。根据要拆分的字符串的复杂性,拆分的内容,拆分字符/短语/等等,您的方法可能会发生变化。