Ruby按空格分割字符串

55

我该如何编写一个Ruby函数,以任何类型的空格符进行分割,并从结果中删除所有空格?例如,如果输入为

 aa bbb
cc    dd ee

然后返回一个数组["aa", "bbb", "cc", "dd", "ee"]

5个回答

69

这是String#split的默认行为:

input = <<-TEXT
 aa bbb
cc    dd ee
TEXT

input.split

结果:

["aa", "bbb", "cc", "dd", "ee"]

这在我测试过的所有 Ruby 版本中都有效,包括 1.8.7、1.9.3、2.0.0 和 2.1.2。


1
这应该是适用于所有最新的Ruby版本的最佳答案。在提出这个问题的时候(2012年),我认为不可能以这种方式做到这一点,这就解释了“复杂的答案”。 - Shashank
2
@Shashank 好的,正如我在答案中提到的,我已经测试过Ruby 1.8.7、1.9.3、2.0.0和2.1.2,它们都像这里展示的一样完美地工作。1.8.7早在2008年就已经发布了,所以即使在回答这个问题时,OP也没有理由不使用String#split。不知道为什么直到现在才有人提到... - Ajedi32
这在2.7.3中仍然有效,并且是一个救命稻草的默认行为。 - Dan

56
以下内容应该适用于您提供的示例:
str.gsub(/\s+/m, ' ').strip.split(" ")

它返回:

["aa", "bbb", "cc", "dd", "ee"]

代码含义:

/\s+/m 是更复杂的部分。\s 表示空格,所以 \s+ 表示一个或多个空格字符。在 /m 部分,m 被称为修饰符,在这种情况下,它表示多行,意思是访问许多行,而不仅仅是默认行为下的一行。

因此,/\s+/m 的意思是查找一个或多个空格的序列。

gsub 意味着替换所有。

strip 相当于其他语言中的 trim ,从字符串前面和后面删除空格。

在我编写说明时,可能会出现在字符串末尾或开头有结束行字符的情况。

为了确保安全,

代码可以写成:

str.gsub(/\s+/m, ' ').gsub(/^\s+|\s+$/m, '').split(" ")

所以如果你有:

str = "\n     aa bbb\n    cc    dd ee\n\n"

那么您将得到:

["aa", "bbb", "cc", "dd", "ee"]

新代码的含义:

^\s+ 字符串开头的一系列空格

\s+$ 字符串结尾的一系列空格

因此,gsub(/^\s+|\s+$/m, '') 的意思是删除字符串开头和结尾的任何一连串空格。


谢谢您的回复,Candide!您(或任何人)介意给您的代码做一个简要的解释吗? - JJ Beck
Rubocop因为双引号而无法通过您的split(" ")。 - ablarg
我喜爱 Ruby。但为什么它不能有科学库,这样我才能真正使用它呢? - WestCoastProjects

24
input = <<X
     aa bbb
cc    dd ee
X

input.strip.split(/\s+/)

7
作为对Vidaica答案的轻微修改,在Ruby 2.1.1中看起来像是这样:
input.split(" ")

将补偿所有空格,包括空格、制表符或换行符,得到以下结果:

["aa", "bbb", "cc", "dd", "ee"]

7
input.split("\s")

如果使用"\s"而不是/\s/,则空格将从结果中移除。

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