我想拆分一个字符串来抑制所有空字段
命令:
",1,2,,3,4,,".split(',')
结果:
["", "1", "2", "", "3", "4", ""]
预期:
["1", "2", "3", "4"]
这该怎么做?
编辑
好.只是总结所有发布的好问题.
我想要的是split方法(或其他方法)不生成空字符串.看起来不可能.
因此,解决方案是两步过程:像往常一样拆分字符串,然后以某种方式从结果数组中删除空字符串.
所以我会用
",1,2,,3,4,,".split(',').delete_if(&:empty?) 
Nikita Rybak和user229426提出的解决方案是使用拒绝方法.根据docs,拒绝返回一个新数组.虽然delete_if方法更有效,因为我不想要副本.使用Mark Byers提出的select更低效.
steenslag建议用空格替换逗号,然后使用空格分割:
",1,2,,3,4,,".gsub(',', ' ').split(' ')
实际上,文档说空间实际上是一个空白区域.但是"split(/\s /)"和"split('')"的结果并不相同.为什么?
Mark Byers提出了另一种解决方案 - 只使用正则表达式.似乎这就是我需要的.但是这个解决方案意味着你必须成为regexp的主人.但这是很好的解决方案!例如,如果我需要空格作为分隔符以及任何非字母数字符号,我可以将其重写为
",1,2, ,3 3,4 4 4,,".scan(/\w+[\s*\w*]*/)
结果是:
["1", "2", "3 3", "4 4 4"]
但是再次使用regexp是非常不直观的,他们需要一种体验.
摘要
我希望拆分与空格一起使用,好像空格是逗号甚至是正则表达式.我希望它不会产生空字符串.我认为这是红宝石中的错误或我的误解.
这是一个社区问题.
Nik*_*bak 14
有一种拒绝方法Array:
",1,2,,3,4,,".split(',').reject { |s| s.empty? }
或者如果您愿意Symbol#to_proc:
",1,2,,3,4,,".split(',').reject(&:empty?)