为了在,
或;
上拆分字符串,我使用了以下简单代码
string.split(/[\s,;]/).reject!(&:empty?)
对于诸如此类的字符串,效果很好
"entry1, entry2, entry3"
"entry1"
"entry1, entry2,"
但问题出在"entry1,"
(单个元素后跟逗号)
请查看这些示例
2.2.4 :033 > 'entry1,'.split(/[\s,;]/).reject!(&:empty?)
=> nil
2.2.4 :034 > 'entry1, entry2'.split(/[\s,;]/).reject!(&:empty?)
=> ["entry1", "entry2"]
2.2.4 :035 > 'entry1, entry2,'.split(/[\s,;]/).reject!(&:empty?)
=> ["entry1", "entry2"]
所以
2.2.4 :033 > 'entry1,'.split(/[\s,;]/).reject!(&:empty?)
=> nil
但是
2.2.4 :037 > 'entry1,'.split(/[\s,;]/)
=> ["entry1"]
答案 0 :(得分:4)
让我们看看reject!
方法的docs:
等效于#delete_if,从自身中删除该块评估为true的元素,但如果未进行任何更改,则返回nil。
由于'entry1, entry2'.split(/[\s,;]/)
的值为["entry1", "", "entry2"]
,因此i。 e。有一个空字符串。那意味着有工作要做。
但是'entry1,'.split(/[\s,;]/)
的值为["entry1"]
,因此返回nil
,因为未进行任何更改。
为了使其更可预测,我建议使用reject
方法:
'entry1,'.split(/[\s,;]/).reject(&:empty?)
# => ["entry1"]
或者依靠reject!
突变的变量:
a = 'entry1,'.split(/[\s,;]/)
a.reject(&:empty?)
a # => ["entry1"]
答案 1 :(得分:1)
我认为您要添加拒绝以从拆分中删除空值,您可以将其更改为类似这样的方式,以消除这种需要:
irb(main):016:0> string = "entry1, entry2; sadq;as"
=> "entry1, entry2; sadq;as"
irb(main):017:0> string.split(/\s*,\s*|\s*;\s*/)
=> ["entry1", "entry2", "sadq", "as"]
或者这是另一种选择,使用map删除空白
irb(main):016:0> string = "entry1, entry2; sadq;as"
=> "entry1, entry2; sadq;as"
irb(main):020:0> string.split(/,|;/).map(&:strip)
=> ["entry1", "entry2", "sadq", "as"]
它不会回答您的问题,但是可以帮助您在此处编写更简单的代码