【发布时间】:2013-07-15 16:54:13
【问题描述】:
假设一个正则表达式来自当前上下文之外的调用代码,然后被传递给在当前项目之外实现的另一个调用:
["1", "2"].grep(/1/) #=> ["1"]
在进行调用时,是否有一种简单的 Rubyish 方式来实现以下行为?
["1", "2"].grep(/1/.negate) #=> ["2"]
此行为类似于将=~ 运算符与!~ 运算符切换。当然,可以使用#select 或#reject,或者打开或继承Regexp。但我很好奇Ruby中是否已经有一种方法可以以上述方式否定正则表达式返回的匹配项。另外,我不在乎 false 或 nil 或 true 或匹配的位置是否参与实现此效果。
有一个相关的theoretical question,但超出了这里的简单考虑范围。
编辑:我知道迭代器是 Ruby 中过滤列表的一般方法,但人们忽略了问题的约束。另外,我认为正则表达式被反转的方式有一些很好的功能。我不认为它过度劳累或过于聪明。它是一种古老的面向对象编程,也是 Ruby 擅长做的事情。
【问题讨论】:
-
虽然在语义上并不明显,但如果您考虑一下,将正则表达式传递给
split“匹配”所有不匹配的子字符串。我对 Ruby 不够熟悉,无法根据此写出答案,但我相信其他人可以。 -
您的问题有点矛盾,因为当您可以简单地更改迭代器时,尝试以这种方式修改正则表达式并不是 Rubyish。我想说你想要达到的目标是 Perlish 而不是 Rubyish。
-
@sawa - 我原则上不反对这一点。但是 Ruby 允许以多种方式解决问题。在这种情况下,我想继续使用我无法控制的方法(不一定是
#grep),例如,它可能不接受块参数。