拆分字符串抑制所有空字段

Van*_*uan 8 ruby split

我想拆分一个字符串来抑制所有空字段

命令:

",1,2,,3,4,,".split(',')
Run Code Online (Sandbox Code Playgroud)

结果:

["", "1", "2", "", "3", "4", ""]
Run Code Online (Sandbox Code Playgroud)

预期:

["1", "2", "3", "4"]
Run Code Online (Sandbox Code Playgroud)

这该怎么做?


编辑

好.只是总结所有发布的好问题.

我想要的是split方法(或其他方法)不生成空字符串.看起来不可能.

因此,解决方案是两步过程:像往常一样拆分字符串,然后以某种方式从结果数组中删除空字符串.

第二部分正是这个问题 (及其重复)

所以我会用

",1,2,,3,4,,".split(',').delete_if(&:empty?) 
Run Code Online (Sandbox Code Playgroud)

Nikita Rybak和user229426提出的解决方案是使用拒绝方法.根据docs,拒绝返回一个新数组.虽然delete_if方法更有效,因为我不想要副本.使用Mark Byers提出的select更低效.

steenslag建议用空格替换逗号,然后使用空格分割:

",1,2,,3,4,,".gsub(',', ' ').split(' ')
Run Code Online (Sandbox Code Playgroud)

实际上,文档说空间实际上是一个空白区域.但是"split(/\s /)"和"split('')"的结果并不相同.为什么?

Mark Byers提出了另一种解决方案 - 只使用正则表达式.似乎这就是我需要的.但是这个解决方案意味着你必须成为regexp的主人.但这是很好的解决方案!例如,如果我需要空格作为分隔符以及任何非字母数字符号,我可以将其重写为

",1,2, ,3 3,4 4 4,,".scan(/\w+[\s*\w*]*/)
Run Code Online (Sandbox Code Playgroud)

结果是:

["1", "2", "3 3", "4 4 4"]
Run Code Online (Sandbox Code Playgroud)

但是再次使用regexp是非常不直观的,他们需要一种体验.

摘要

我希望拆分与空格一起使用,好像空格是逗号甚至是正则表达式.我希望它不会产生空字符串.我认为这是红宝石中的错误或我的误解.

这是一个社区问题.

Nik*_*bak 14

有一种拒绝方法Array:

",1,2,,3,4,,".split(',').reject { |s| s.empty? }
Run Code Online (Sandbox Code Playgroud)

或者如果您愿意Symbol#to_proc:

",1,2,,3,4,,".split(',').reject(&:empty?)
Run Code Online (Sandbox Code Playgroud)