Rubyish方式反转正则表达式

时间:2013-07-15 16:54:14

标签: ruby regex

假设正则表达式来自当前上下文之外的调用代码,然后传递给在当前项目之外实现的另一个调用:

["1", "2"].grep(/1/)        #=> ["1"]

在进行调用时,是否有一种简单的Ruby方式来实现以下行为?

["1", "2"].grep(/1/.negate) #=> ["2"]

此行为类似于使用=~运算符切换!~运算符。当然,可以使用#select#reject,或者打开或子类Regexp。但我很好奇Ruby中是否有一种方法可以用上述方式否定正则表达式返回的匹配。此外,我不关心falseniltrue或匹配的位置是否与实现此效果有关。

有一个theoretical question是相关的,但这超出了这里的简单考虑。


编辑:我认为迭代器是Ruby中过滤列表的一般方法,但是人们忽略了问题的限制。另外,我认为正则表达式被颠倒的方式有一些很好的功能。对于我来说,我不认为它过于紧张或过于聪明;它是一种简单的面向对象编程,也是Ruby擅长的事情。

5 个答案:

答案 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]