从数组中删除空格,制表符和换行

时间:2019-02-25 01:25:56

标签: ruby

如何从该数组中删除制表符,换行和空白?

array1 = ["E", "A", "C", "H", " ", "L", "I", "N", "E", " ", "E", "N", "D", "S", " ", "W", "I", "T", "H", " ", "A", " ", "A", "C", "C", "I", "D", "E", "N", "T", "A", "L", "L", "Y", " ", " ", "A", "D", "\"", "A", " ", "A", "C", "C", "I", "\n", "\""]

我尝试了以下操作,但这些似乎都无法正常工作。

array1.map!(&:strip)

array1.reject!(&:empty?)

array1.reject(&:empty?)

array1 - [""]

array1.delete_if {|x| x == " " } 

3 个答案:

答案 0 :(得分:4)

array1 = ["E", " ", ":", "L", "É", "\t", "T",
          "-", "H", "\n", "\""]

array1.reject { |s| s.match? /\s/ }
  #=> ["E", ":", "L", "É", "T", "-", "H", "\""]
正则表达式中的

\s匹配所有空格字符,即空格,制表符("\t")换行符("\n"),回车符("\r")和换页符( "\f"

后两者的起源是使用电传打字机的那一天,回车是指打印头从行尾到行首的移动,而换页使行进的纸张前进一行。 1

1 Microsoft Windows仍然可以识别回车和换页,从而保持对电传打字机的支持。 ¯\ _(ツ)_ /¯

答案 1 :(得分:2)

您可以使用grep选择与模式匹配的元素。该模式可以是简单的regexp,例如/\s/,它与空格字符匹配:

array1.grep(/\s/)
#=> [" ", " ", " ", " ", " ", " ", " ", " ", "\n"]

结果是一个数组,其中所有元素至少包含一个空格字符。

还有\S(大写)与非空白字符匹配:

array1.grep(/\S/)
#=> ["E", "A", "C", "H", "L", "I", "N", "E", "E", "N", "D", "S", "W",
#    "I", "T", "H", "A", "A", "C", "C", "I", "D", "E", "N", "T", "A",
#    "L", "L", "Y", "A", "D", "\"", "A", "A", "C", "C", "I", "\""]

我们有grep_v,它是grep的反向版本。如果您想明确指定空格,制表符和换行符,这将很有用:

array1.grep_v(/[ \t\n]/)
#=> ["E", "A", "C", "H", "L", "I", "N", "E", "E", "N", "D", "S", "W",
#    "I", "T", "H", "A", "A", "C", "C", "I", "D", "E", "N", "T", "A",
#    "L", "L", "Y", "A", "D", "\"", "A", "A", "C", "C", "I", "\""]

答案 2 :(得分:0)

此外,还有其他可能的变体:

array1 = [" ", "A", "\n", "\t", "B", "\r"]
array1.delete_if { |s| s.match? /\s/ }
#=> ["A", "B"]
array1 = [" ", "A", "\n", "\t", "B", "\r"]
array1.keep_if { |s| !s.match? /\s/ }
#=> ["A", "B"]
array1 = [" ", "A", "\n", "\t", "B", "\r"]
array1.select! { |s| !s.match? /\s/ }
#=> ["A", "B"]

使用match?而不是match更为可取,不仅因为我们不使用MatchData

关键是基准测试表明match?快将近2倍。

当处理大量数据时,这可能很重要。