Ruby grep没有过滤掉不匹配的输入

时间:2018-08-13 00:23:08

标签: ruby

鉴于我有这个课程:

class A
  attr_accessor :a, :b, :c, :d
end

鉴于这些是实例方法:

A.instance_methods(false)
 => [:a, :a=, :b, :b=, :c, :c=, :d, :d=]

我尝试用“ =”:

过滤掉数组中的任何项目
A.instance_methods(false).grep(/[^=]/)
 => [:a, :a=, :b, :b=, :c, :c=, :d, :d=] 

 A.instance_methods(false).grep(/[a-zA-Z]/)
 => [:a, :a=, :b, :b=, :c, :c=, :d, :d=] 

但是它不会用“ =”过滤掉项目。我在做什么错了?

2 个答案:

答案 0 :(得分:5)

  

我尝试用“ =”过滤掉数组中的任何项目。

在这种类型的过滤中,您可能想使用grep_v,它是grep的反函数。它删除与正则表达式匹配的所有内容。

现在您的表情变得简单了:

[:a, :a=, :b, :b=, :c, :c=, :d, :d=].grep_v(/=/)
=> [:a, :b, :c, :d]

答案 1 :(得分:4)

您可以将锚添加到正则表达式:

class A
  attr_accessor :a, :b, :c, :d
end

p A.instance_methods(false)
p A.instance_methods(false).grep(/^[a-zA-Z]+$/)  # [1]
p A.instance_methods(false).grep(/[^=]$/)        # [2] 

输出:

[:d, :a=, :b=, :b, :c=, :a, :c, :d=]
[:d, :b, :a, :c]
[:d, :b, :a, :c]

正如Dan Farrell所指出的,您的正则表达式过于宽泛,并且分别与“没有=”或“具有字母字符”的任何内容匹配。添加锚点会将匹配范围缩小到[1]中的“仅一个或多个字母”,而缩小到=中的“不以[2]字符结尾”。