如何从该数组中删除制表符,换行和空白?
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 == " " }
答案 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倍。
当处理大量数据时,这可能很重要。