给定一个字符串 s="......",大概好几千的字符的样子
ruby 怎样像 python 那样,依靠 s[i::5] 可以从第 i 个字符开始每隔 5 个重新构成一个字符串。我能想到的是: s.each_char.with_index{|c,idx| another_s<<c if idx%5==i},不知有没有简洁的方法
s.each_char.with_index{|c,idx| another_s<<c if idx%5==i}
假如 s 长度为 1000,怎样在每 100 个字符后添加一个 "\n",重新构成一个长为 1010 的字符串?
第二个问题的背景是,我想对 s 中每 100 个字符作正则替换
rails 的 Array 拓展可以解决你的问题 1、s.each_char[0..-1].in_groups_of(5) 2、s.each_char.in_groups_of(100).map(&:join).join("\n")
s.each_char[0..-1].in_groups_of(5)
s.each_char.in_groups_of(100).map(&:join).join("\n")
Enumerable#each_cons
#3 楼 @doitian 好高级 我竟然都没用过原生的 一直用 rails 的...
String 用 scan 也可以
scan
s.scan(/.{1,5}/m) # 如果不是 5 的倍数用 {5} 最后一块不会返回
更方便的是用 gsub 加 block 直接完成替换
gsub
s.gsub(/.{1,5}/m) {|m| m + "\n"}
补充:不加 m 会跳过换行
m
string = '.........' rows = (string.size/5) == 0 ? string.size/5 : (string.size/5) + 1 rows.times do |i| string[i * 5, 5].each do |str| #JUST DO IT end end
第一个问题暂时想到用 range step:
(i..s.length).step(5).collect {|e| s[e]}.join
@zj0713001 我说怎么你的方法我不能用呢……
我看了下,对第二问而言,@doitian each_con 似乎没有 each_slice 更方便
非常感谢 @doitian s.gsub(/.{1,5}/m) {|m| m + "\n"} 非常方便
#8 楼 @lufeihaidao 嗯,应该是用 each_slice
each_slice