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

Ruby 拆分字符串以抑制所有空字段,ruby,split,Ruby,Split,我想拆分一个字符串,以抑制所有空字段 命令: ",1,2,,3,4,,".split(',') 结果: ["", "1", "2", "", "3", "4", ""] 预期: ["1", "2", "3", "4"] 如何做到这一点 编辑 嗯。我只是想总结一下所有贴出的好问题 我想要的是split方法(或其他方法)不会生成空字符串。看来这是不可能的 所以,解决方案分为两步:像往常一样分割字符串,然后以某种方式从结果数组中删除空字符串 第二部分正是 (及其附属机构) 所以我会用 ",1,

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

命令:

",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提出的解决方案是使用拒绝方法。根据reject返回一个新数组。方法更有效,因为我不需要副本。使用马克·拜尔斯提出的方法更加低效

steenslag建议将逗号替换为空格,然后使用按空格拆分:

",1,2,,3,4,,".gsub(',', ' ').split(' ')
实际上,他说空间实际上是一个空白。但“拆分(/\s/)”和“拆分(“”)”的结果不一样。为什么

马克·拜尔斯提出了另一种解决方案——只使用正则表达式。看来这就是我需要的。但是这个解决方案意味着您必须掌握regexp。但这是一个很好的解决方案!例如,如果我需要空格作为分隔符以及任何非字母数字符号,我可以将其重写为

",1,2, ,3 3,4 4 4,,".scan(/\w+[\s*\w*]*/)
结果是:

["1", "2", "3 3", "4 4 4"]
但是,regexp非常不直观,它们需要经验

总结

我希望split能够像处理逗号甚至regexp一样处理空白。我希望它不会产生空字符串。我认为这是ruby中的一个bug或是我的误解

让它成为一个社区问题。

数组中有一个方法:

",1,2,,3,4,,".split(',').reject { |s| s.empty? }
或者如果您更喜欢
Symbol#而不是_proc

",1,2,,3,4,,".split(',').reject(&:empty?)
您可以使用以下命令:

或者,您可以使用正则表达式来匹配要保留的内容,而不是在分隔符上拆分:

",1,2,,3,4,,".scan(/[^,]+/)
当模式为单个空格()时,字符串#拆分(模式)的行为符合要求


希望在这里说明一下:

但“拆分(/\s/)”和“拆分(“”)”的结果不一样。为什么

如果您查看String#split的文档,您会发现使用“”进行拆分是一种特殊情况:

If pattern is a single space, str is split on whitespace,
with leading whitespace and runs of contiguous whitespace characters ignored.
你还提到:

我希望它不会产生空字符串。我认为这是ruby中的一个bug或是我的误解

问题可能出在键盘和椅子之间

split会很高兴地产生空字符串,因为有时候你肯定会想要这个功能,而且有很多简单的方法可以解决这个问题。考虑是否从一个Excel文件中分割CSV。无论在何处看到“,”都将是一个空列,而不是一个您应该删除的列

不管怎样,您已经看到了一系列解决方案——这里还有一个可能会向您展示使用ruby和split可以做的事情

看起来您想要在多个逗号之间分割数据,那么为什么不试试看会发生什么呢

a = ",1,2,,3,4,,5,,,,6,,,".split(/,+/)
这是一个非常简单的正则表达式:/,+/表示一个或多个逗号,因此我们将对此进行拆分

这几乎给出了您想要的,除了您还想忽略前导的空字段之外。您会注意到split忽略了结尾的空字段,因为(从字符串#split docs):

这意味着我们可以使用一些东西来删除数组前面的nil,或者只删除初始逗号。我们可以使用gsub实现这一点:

a = ",1,2,,3,4,,5,,,,6,,,".gsub(/^,+/,'')
如果你把它打印出来,你会看到后面的空“字段”现在不见了。因此,我们可以将它们组合在一行中:

a = ",1,2,,3,4,,5,,,,6,,,".gsub(/^,+/,'').split(/,+/)
你还有另一个解决办法

顺便说一句,这指出了另一种可能性,如果我们想要一个简单的拆分,我们可以在将字符串发送到split之前完全清理字符串。我会让你去弄清楚这个人在做什么:

a = ",1,2,,3,4,,5,,,,6,,,".gsub(/,+/,',').gsub(/^,/,'').split(',')
用ruby做事情有很多方法。如果ruby似乎没有达到你想要的效果,那么看看文档,意识到它的工作方式可能是有原因的(如果split不能吐出空字段,很多人会感到不安:)


希望有帮助

不是ruby专家,但似乎或多或少都是同一个问题,在数组上映射删除时,谈论计时。我也很奇怪,当两个值与一行中的Regexp不匹配时,返回一个空字符串(
)。我发现了类似的解决方案:“,1,2,3,4,”。split(“,”)。delete(如果(&:empty?)@如果你把答案写在@nikita,我会投票支持这个答案。这个可以用s.empty来简化吗?而不是将其与空字符串进行比较,并通过将符号#应用于vanuan在评论中使用的#to#proc技巧使其更酷。i、 e.将拒绝重写为.reject&:empty?甚至更短:“,1,2,3,4,,”.split(',')。reject(&:empty?)Hm。。。如果我希望子字符串中包含空格,该怎么办?(“,12,,,34,,”)那不行
If the limit parameter is omitted, trailing null fields are suppressed.
a = ",1,2,,3,4,,5,,,,6,,,".gsub(/^,+/,'')
a = ",1,2,,3,4,,5,,,,6,,,".gsub(/^,+/,'').split(/,+/)
a = ",1,2,,3,4,,5,,,,6,,,".gsub(/,+/,',').gsub(/^,/,'').split(',')