我有字符串:"how to \"split string\" to \"following array\""
(如何“拆分字符串”到“跟随数组”)。
我想获得以下数组:
["how", "to", "split string", "to", "following array"]
我尝试了split(' ')
,但结果是:
["how", "to", "\"split", "string\"", "to", "\"following", "array\""]
答案 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 }
当你拆分引号时,你肯定知道数组中的每个字符串都是:非引用,引用,引用,引用,非引用等......
如果我们将这些分组成对,那么我们会得到以下两种情况之一:
[ "non-quoted", "quoted" ]
[ "non-quoted", nil ]
(仅限最后一对不平衡字符串)例如1,我们拆分nq并附加q
例如2,我们拆分nq并丢弃q
即:a = n.split; (a << q if q) || q
然后我们加入所有对(flat_map
的平坦部分)