Ruby相当于grep -v

Hsi*_*siu 8 ruby regex grep

这就是我一直在做的事情:

my_array.reject { |elem| elem =~ /regex/ }.each { ... }
Run Code Online (Sandbox Code Playgroud)

我觉得这有点笨拙,但我还没有找到任何可以让我改变它的东西 my_array.grepv /regex/ { ... }

有这样的功能吗?

PJS*_*and 13

Ruby 2.3实现的Enumerable#grep_v方法正是您所追求的.

https://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-grep_v


And*_*imm 7

你知道Symbol#to_proc链接有什么帮助吗?你可以用正则表达式做同样的事情:

class Regexp
  def to_proc
    Proc.new {|string| string =~ self}
  end
end

["Ruby", "perl", "Perl", "PERL"].reject(&/perl/i)
=> ["Ruby"]
Run Code Online (Sandbox Code Playgroud)

但你可能不应该这样做.Grep不仅适用于正则表达式 - 您可以像下面这样使用它

[1,2, "three", 4].grep(Fixnum)
Run Code Online (Sandbox Code Playgroud)

如果你想grep -v,你必须实现Class#to_proc,这听起来是错误的.


Kel*_*vin 6

这个怎么样?

arr = ["abc", "def", "aaa", "def"]
arr - arr.grep(/a/) #=> ["def", "def"]

我特意包含了一个 dup 以确保所有这些都被退回。


Jer*_*emy 0

尝试使用Array#collect!

my_array.collect! do |elem|
  if elem =~ /regex/
    # do stuff
    elem
  end
end
Run Code Online (Sandbox Code Playgroud)

编辑:抱歉,那么您必须Array#compact稍后再打电话。至少这会消除第二个区块。但它更多的是物理代码。这取决于你做了多少“事情”。