将字符串按空格分割成数组

8
我希望用户输入一些单词,并将它们转换为数组。我想按单词拆分。以下是一个示例:
"15 17 21 46" → [15, 17, 21, 46]
像split("")和scan这样的东西会将每个字母都组成一个数组。
我更喜欢不使用YAML来完成它。请注意,在示例中,它不包括空格,但它使用空格作为值之间的分隔符。
是否可能像上面示例中所做的那样,将一堆带有空格的数字直接转换为整数?我觉得空格可能会在我执行to_i之类的操作时中断它。
这个问题类似于String to Array in Ruby,但它没有答案。

2
传递给 .split('') 的参数实际上是数组元素的分隔符,因此如果你使用 split(','),输入将会被逗号分割,从而将由逗号分隔的每个字符序列转换为数组的成员。要将输入转换为整数,只需对数组使用 .map(&:to_i) 即可。 - dimitry_n
2个回答

8

String#split方法在不需要指定分隔符的情况下可以根据空格进行分割:

"15 17 21 46".split
#=> ["15", "17", "21", "46"]

如果您想指定一个参数,需要使用空格而不是空字符串:
"15 17 21 46".split(' ')
#=> ["15", "17", "21", "46"]

如果您想将这些字符串转换为整数:

"15 17 21 46".split(' ').map(&:to_i)
#=> [15, 17, 21, 46]

在这个例子中,.map() 是做什么的?我知道 to_i 的作用,但为什么要使用 .map() - CyanCoding
@CyanCoding:我正在调用的对象是什么?相应的文档在哪里?为什么“15 17 21 46”.split.to_i不起作用?这些都是你在不知道一个方法的作用时应该问自己的问题。 - Eric Duminil
1
对于不熟悉 split 的读者:没有参数的 split 等同于 split(/\s+/),其中 \s 表示空格字符(主要是空格、制表符(\t)和换行符(\n),但也包括回车符(\r)和换页符(\f)),因此 "1     2, 3".split #=> [1,2,3] - Cary Swoveland

1

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>'

再次强调,哪种方式“正确”取决于字符串和您的目标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接