Eric Duminil的答案展示了如何根据内容不是空格来分割字符串。如果您知道您的字符串只包含感兴趣的数字和空格,则这是完全有效的。
您还可以根据您想要的元素(数字)和您不想要的元素(数字之间的空格)来收集元素。
要在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
,因为单词边界符
\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>'
再次强调,哪种方式“正确”取决于字符串和您的目标。
.split('')
的参数实际上是数组元素的分隔符,因此如果你使用split(',')
,输入将会被逗号分割,从而将由逗号分隔的每个字符序列转换为数组的成员。要将输入转换为整数,只需对数组使用.map(&:to_i)
即可。 - dimitry_n