gpt4 book ai didi

ruby - 如何(轻松)在 Ruby 中使用长度和分隔符拆分字符串

转载 作者:数据小太阳 更新时间:2023-10-29 07:44:48 27 4
gpt4 key购买 nike

我需要在 Ruby 中拆分一个具有以下格式的字符串:

 [{a:1,b:2,c:3,d:4},{a:5,b:6,c:7,d:8},{a:9,b:10,c:11,d:12},{a:13,b:14,c:15,d:16}]

即。它是一个生成的 javascript 数组。不幸的是,列表很长,我想在达到适合使用代码编辑器编辑它的特定长度后,将其拆分为数组元素分隔符逗号,但要保持元素的完整性。例如,上面分割宽度为 15 的行将变为:

 [{a:1,b:2,c:3,d:4},
{a:5,b:6,c:7,d:8},
{a:9,b:10,c:11,d:12},
{a:13,b:14,c:15,d:16}]

宽度为 32 的文本将是:

 [{a:1,b:2,c:3,d:4},{a:5,b:6,c:7,d:8},
{a:9,b:10,c:11,d:12},{a:13,b:14,c:15,d:16}]

除了经典的“蛮力”方法(循环,检查 }{ 之间的分隔符,同时增加长度,如果长度大于并找到有效分隔符则拆分)这个问题是否有更“Rubyish”的解决方案?

编辑:附加的天真方法,绝对不是 Rubyiish,因为我没有很强的 Ruby 背景:

def split(what, length)
result = []
clength = 0
flag = FALSE
what_copy = what.to_s
what_copy.to_s.each_char do |c|
clength += 1
if clength > length
flag = TRUE
end

if c == '}' and flag
result << what[0 .. clength]
what = what[clength+1 .. -1]
clength = 0
flag = FALSE
end
end
pp result
sres = result.join("\n")
sres
end

最佳答案

您可以使用正则表达式:

  • 至少 width-2 个字符的非贪婪重复
  • 后跟
  • 后跟 ,]

data = "[{a:1,b:2,c:3,d:4},{a:5,b:6,c:7,d:8},{a:9,b:10,c:11,d:12},{a:13,b:14,c:15,d:16}]"

def split_data_with_min_width(text, width)
pattern = /
( # capturing group for split
.{#{width-2},}? # at least width-2 characters, but not more than needed
\} # closing curly brace
[,\]] # a comma or a closing bracket
)
/x # free spacing mode
text.split(pattern).reject(&:empty?).join("\n")
end

puts split_data_with_min_width(data, 15)
# [{a:1,b:2,c:3,d:4},
# {a:5,b:6,c:7,d:8},
# {a:9,b:10,c:11,d:12},
# {a:13,b:14,c:15,d:16},
# {a:17,b:18,c:19,d:20}]

puts split_data_with_min_width(data, 32)
# [{a:1,b:2,c:3,d:4},{a:5,b:6,c:7,d:8},
# {a:9,b:10,c:11,d:12},{a:13,b:14,c:15,d:16},
# {a:17,b:18,c:19,d:20}]

该方法使用split使用捕获组而不是 scan因为字符串的最后一部分可能不够长:

"abcde".scan(/../)
# ["ab", "cd"]
"abcde".split(/(..)/).reject(&:empty?)
# ["ab", "cd", "e"]

关于ruby - 如何(轻松)在 Ruby 中使用长度和分隔符拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43518160/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com