将字符串拆分为带有ruby的数组

时间:2017-02-17 08:56:54

标签: arrays ruby split

我有字符串:"how to \"split string\" to \"following array\""如何“拆分字符串”到“跟随数组”)。

我想获得以下数组:

["how", "to", "split string", "to", "following array"]

我尝试了split(' '),但结果是:

["how", "to", "\"split", "string\"", "to", "\"following", "array\""]

2 个答案:

答案 0 :(得分:2)

x.split('"').reject(&:empty?).flat_map do |y|
  y.start_with?(' ') || y.end_with?(' ') ? y.split : y
end

说明:

  • split('"')会对字符串进行分区,使得非引用字符串具有前导或尾随空格,而引用的字符串则不会。
  • 以下flat_map只有在符合非引用类别的情况下,才会按空格进一步拆分单个字符串。
  • 请注意,如果有两个连续的引用字符串,其间的空格将是第一个空格后的自己的字符串,并在第二个空格后完全消失。又名:

    'foo "bar" "baz"'.split('"') # => ["foo ", "bar", " ", "baz"]
    ' '.split # => []
    
  • 如果我们以带引号的字符串

    开头,则需要reject(&:empty?)
    '"foo"'.split('"') # => ["", "foo"]
    

答案 1 :(得分:0)

x作为您的字符串:

x.split(?").each_slice(2).flat_map{|n, q| a = n.split; (a << q if q) || a }

当你拆分引号时,你肯定知道数组中的每个字符串都是:非引用,引用,引用,引用,非引用等......

如果我们将这些分组成对,那么我们会得到以下两种情况之一:

  1. [ "non-quoted", "quoted" ]
  2. [ "non-quoted", nil ](仅限最后一对不平衡字符串)
  3. 例如1,我们拆分nq并附加q
    例如2,我们拆分nq并丢弃q
    即:a = n.split; (a << q if q) || q

    然后我们加入所有对(flat_map的平坦部分)