Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何(轻松)在Ruby中使用长度和分隔符拆分字符串_Ruby_String_Split - Fatal编程技术网

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

如何(轻松)在Ruby中使用长度和分隔符拆分字符串,ruby,string,split,Ruby,String,Split,我需要在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

我需要在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}]
除了经典的“暴力”方法(循环,在增加长度的同时检查
}
{
之间的分隔符,如果长度大于并找到有效分隔符,则进行拆分)之外,是否还有更“鲁比”的解决方案

编辑:附上天真的方法,绝对不是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
def拆分(什么,长度)
结果=[]
长度=0
flag=FALSE
what\u copy=what.to\s
每个字符都做什么|
长度+=1
如果长度>长度
flag=TRUE
结束
如果c=='}'和标志
结果像这样

2.3.1 :007 > a
 => "[{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}]" 
2.3.1 :008 > q =  a.gsub("},", "},\n")
 => "[{a:1,b:2,c:3,d:4},\n{a:5,b:6,c:7,d:8},\n{a:9,b:10,c:11,d:12},\n{a:13,b:14,c:15,d:16}]" 
2.3.1 :009 > puts q
[{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}]
 => nil 
2.3.1 :010 > 

您可以将正则表达式用于:

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

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

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

def doit(str, min_size)   
  r = /
      (?:                # begin non-capture group                
        .{#{min_size},}? # match at least min_size characters, non-greedily
        (?=\{)           # match '{' in a positive lookahead
        |                # or
        .+\z             # match one or more characters followed by end of string
      )                  # close non-capture group
      /x                 # free-spacing regex definition mode
  str.scan(r)
end
示例

str = "[{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}]"

doit(str, 18) # same for all min_size <= 18
  #=> ["[{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}]"] 
doit(str, 19)
  #=> ["[{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}]"]
doit(str, 20)
  #=> ["[{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}]"] 
doit(str, 21)
  #=> ["[{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}]"] 
doit(str, 22) # same for 23 <= min_size <= 37
  #=> ["[{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}]"]
doit(str, 38) # same for 39 <= min_size <= 58
  #=> ["[{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}]"] 
doit(str, 59) # same for min_size > 59
  #=> ["[{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}]"] 
str=“[{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}”
doit(str,18)#对于所有最小尺寸都相同[“[{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}]”
doit(str,19)
#=>[“[{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}]”
doit(str,20)
#=>[“[{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}]”
多伊特(str,21)
#=>[“[{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}]”
doit(str,22)#与23相同[“{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,那么我只能得到2行。问题更新了。32是指前32个吗?因为第二行超过32。由于所有提示,例如
2.3.1:007:>
,您的代码很难阅读。此外,如果有人想运行你的代码,他们不能只是剪切和粘贴。最好去掉那些提示。你写了经典的暴力方法吗?@EricDuminil是的,问题更新我真的不明白这个问题要问什么?您是否可能希望分割{}中包含的数据,也就是说,您是否只需要{a:1,b:2},并明显地添加额外的大括号?另一方面,如果{}总是包含4项,为什么不用大括号将它们分组并返回1、2、3或4??正则表达式FTW!(尽管我不会将方法命名为“doit”)+1Nice。我没有花太多时间尝试
扫描
唯一的解决方案,但我没有找到任何合适的正则表达式。这也是我第一次使用
{32,}?
我不确定它是否有效,也找不到任何关于它的文档。@Eric,同上
{32,}?
str = "[{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}]"

doit(str, 18) # same for all min_size <= 18
  #=> ["[{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}]"] 
doit(str, 19)
  #=> ["[{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}]"]
doit(str, 20)
  #=> ["[{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}]"] 
doit(str, 21)
  #=> ["[{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}]"] 
doit(str, 22) # same for 23 <= min_size <= 37
  #=> ["[{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}]"]
doit(str, 38) # same for 39 <= min_size <= 58
  #=> ["[{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}]"] 
doit(str, 59) # same for min_size > 59
  #=> ["[{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}]"]