50

如何编写一个 Ruby 函数,通过任何类型的空格分割输入,并从结果中删除所有空格?例如,如果输入是

 aa bbb
cc    dd ee

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

4

5 回答 5

62

这是 的默认行为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。

于 2014-08-01T19:38:56.577 回答
53

以下应该适用于您提供的示例:

str.gsub(/\s+/m, ' ').strip.split(" ")

它返回:

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

代码含义:

/\s+/m是更复杂的部分。\s表示空白,因此\s+表示一个或多个空白字母。在该/m部分中,m称为修饰符,在这种情况下,它表示multiline,表示访问多行,而不仅仅是默认行为。所以,/\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, '')意味着删除字符串开头和字符串结尾的任何空格序列。

于 2012-11-24T03:28:41.500 回答
24
input = <<X
     aa bbb
cc    dd ee
X

input.strip.split(/\s+/)
于 2012-11-24T04:07:43.533 回答
7
input.split("\s")

如果"\s"使用 代替/\s/,则会从结果中删除空格。

于 2013-05-01T12:11:46.040 回答
6

作为对 Vidaica 答案的轻微修改,在 Ruby 2.1.1 中,它看起来像

input.split(" ")

将补偿所有空格,无论是空格、制表符还是换行符,产生:

["aa", "bbb", "cc", "dd", "ee"]
于 2014-08-01T19:24:14.653 回答