【问题标题】:Split string by spaces into an array按空格将字符串拆分为数组
【发布时间】:2017-07-04 16:27:41
【问题描述】:

我想让用户输入一些单词,然后将它们转换为数组。我想按单词分开。这是一个例子:

"15 17 21 46" → [15, 17, 21, 46]

像split("") 和scan 这样的东西用每个字母组成一个数组。

我宁愿不使用 YAML。另外,请注意示例中它不包含空格,但它使用空格作为值之间的分隔符。

是否可以像我在上面的示例中所做的那样,我有一堆带空格的数字,并且这些数字直接转换为整数?我觉得空格可能会打断它,以防我执行to_i 之类的操作。

这个问题类似于String to Array in Ruby,但它没有答案。

【问题讨论】:

  • .split('') 传入的参数实际上是数组元素的分隔符,所以你如果split(','),输入会被逗号分割,从而将输入的每一个逗号分隔的字符序列变成成员或数组。要将输入转换为整数,您只需 .map(&:to_i) 您的数组即可。

标签: arrays ruby string


【解决方案1】:

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:我调用map 的对象是什么?对应的文档在哪里?为什么"15 17 21 46".split.to_i 不起作用?当您不知道某个方法可以做什么时,您应该问自己这些问题。
  • 不熟悉split的读者:split不带参数等价于split(/\s+/),\s代表一个空白字符(主要是空格,制表符(\t)和换行符(@987654336) @),还有回车 (\r) 和换页 (\f)),所以,"1     2, 3".split #=> [1,2,3]。
【解决方案2】:

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

同样,这取决于字符串和您的目标,以确定哪个是“正确的”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2016-04-01
    • 2012-05-12
    相关资源
    最近更新 更多