为什么Ruby String#split不将连续尾随分隔符视为单独的实体?

我正在阅读一个政府文本文件,其中$被用作分隔符,但我认为分隔符不重要…

所以这是预期的:

'a$b$c$d'.split('$') # => ["a", "b", "c", "d"] 

在我正在使用的数据文件中,列标题行(第一行)被统一填充,即没有空标题,如:

 'a$b$$d' # or: 'a$b$c$' 

但是,每行可能有连续的尾随分隔符,例如:

 "w$x$$\r\n" 

通常,我会阅读每一行并扼杀它。 但是这会导致String#split将最后两个分隔符视为一列:

 "w$x$$\r\n".chomp.split('$') # => ["w", "x"] 

不做chomp得到我想要的结果,虽然我应该选择最后一个元素:

 "w$x$$\r\n".split('$') # => ["w", "x", "", "\r\n"] 

所以我要么:

  • 如果最终的非换行符不是连续的分隔符, 则选择该行
  • 保留换行符,进行拆分,然后在最终字符为连续分隔符时选择最终元素

这看起来真的很尴尬……我在这里错过了一些东西吗?

您需要传递负值作为要split的第二个参数。 这可以防止它抑制尾随空字段:

 "w$x$$\r\n".chomp.split('$', -1) # => ["w", "x", "", ""] 

请参阅有关split的文档 。