假设正则表达式来自当前上下文之外的调用代码,然后传递给在当前项目之外实现的另一个调用:
["1", "2"].grep(/1/) #=> ["1"]
在进行调用时,是否有一种简单的Ruby方式来实现以下行为?
["1", "2"].grep(/1/.negate) #=> ["2"]
此行为类似于使用=~
运算符切换!~
运算符。当然,可以使用#select
或#reject
,或者打开或子类Regexp
。但我很好奇Ruby中是否有一种方法可以用上述方式否定正则表达式返回的匹配。此外,我不关心false
或nil
或true
或匹配的位置是否与实现此效果有关。
有一个theoretical question是相关的,但这超出了这里的简单考虑。
编辑:我认为迭代器是Ruby中过滤列表的一般方法,但是人们忽略了问题的限制。另外,我认为正则表达式被颠倒的方式有一些很好的功能。对于我来说,我不认为它过于紧张或过于聪明;它是一种简单的面向对象编程,也是Ruby擅长的事情。
答案 0 :(得分:6)
["1", "2"].reject { |e| /1/ === e }
答案 1 :(得分:3)
您可以这样做:
class NegatedRegex < Regexp
def ===(other)
!super
end
end
class Regexp
def negate
NegatedRegex.new self
end
end
可能还有其他重新实现的方法,但对于grep来说这已经足够了:
["1", "2"].grep(/1/.negate) #=> ["2"]
答案 2 :(得分:3)
你可以一次性完成这些任务:
re = /1/
matches, non_matches = ["1", "2", "1", "3"].partition { |el| re =~ el }
p matches #=> ["1", "1"]
p non_matches #=> ["2", "3"]
答案 3 :(得分:1)
arr=["1","2"]
arr-arr.grep("1") # ["2"]
:)
答案 4 :(得分:1)
这可能是这样做的一种方式
["1", "2", 3].select {|i| i !~ /1/ }
=> ["2", 3]