鉴于我有这个课程:
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=]
但是它不会用“ =”过滤掉项目。我在做什么错了?
答案 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]
字符结尾”。