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(',')