Eric Duminil 的answer 展示了如何在内容不是空格的地方分割字符串。如果您知道您的字符串仅包含感兴趣的数字和空格,则完全有效。
你还可以根据你想要的——数字与你不想要的——数字之间的空格来收集元素。
要在 Ruby 中执行此操作,请使用带有 .scan 的正则表达式:
> "15 17 21 46".scan(/\d+/)
=> ["15", "17", "21", "46"]
或者,如果您在不想要的字符串中嵌入了数字:
> "15 17 21 46 123abc 34".scan(/\b\d+\b/)
=> ["15", "17", "21", "46", "34"]
请注意,123 不包括在内,因为它是字符串 123abc 的一部分,而不是:
> "15 17 21 46 123abc 34".scan(/\d+/)
=> ["15", "17", "21", "46", "123", "34"]
这包括 123,因为单词 break \b 不是正则表达式的一部分。
如果你只是按空格分割:
> "15 17 21 46 123abc 34".split
=> ["15", "17", "21", "46", "123abc", "34"]
“正确答案”取决于您的目标和数据。
然后您可以将这些值转换为整数:
"15 17 21 46 123abc 34".scan(/\b\d+\b/).map {|s| Integer(s) }
=> [15, 17, 21, 46, 34]
请注意,我打电话给Integer,而不是更宽容的.to_i。 Integer 将针对未完全转换为整数的字符串引发异常,而 to_i 将转换前几个字符串并静默忽略其他任何内容:
> '1.5E+06'.to_i
=> 1
> Integer('1.5E+06')
ArgumentError: invalid value for Integer(): "1.5E+06"
from (irb):19:in `Integer'
from (irb):19
from /usr/local/bin/irb:11:in `<main>'
同样,这取决于字符串和您的目标,以确定哪个是“正确的”。