以下命令适用于Ruby 1.9.3p194
> %w(a b c).grep(/a/) { |v| v.upcase }
=> ["A"]
但是如果数组中的任何元素都有斜杠,则抛出一个SyntaxError:
> %w(a/ b c).grep(/a/) { |v| v.upcase }
SyntaxError: (irb):41: syntax error, unexpected tMATCH
%Q/a// =~ /a/
我假设我正在使用grep错误,但我得到的错误实在令人困惑。为什么会抛出此错误,以及基于正则表达式在数组中查找元素的正确方法是什么?
更新
选择给了我想要的东西,但我仍然很好奇grep的用途......
> %w(a/ b c).select {|v| v =~ /a/ }
=> ["a/"]
答案 0 :(得分:2)
我无法重现您的错误。
起初我认为这是IRb的一个问题。众所周知,IRb的解析器(基本上是一个不可维护的Regexp
管道绑在一起的hodge-podge)不正确地解析一些结构。此外,由于IRb的工作方式,Ruby和IRb之间存在语义差异,尤其是局部变量和全局方法。
这就是为什么你应该总是在普通Ruby中重现你的错误然后在这里发布它。或者至少在Pry中尝试,它使用YARV,Rubinius或JRuby的解析器,而不是自己编译。
但事实并非如此:您的第一个代码段在纯Ruby和IRb中都可以正常工作。
您的第二个代码段,然而,将 生成您遇到的错误,甚至在纯Ruby中运行时:
ruby -e '%Q/a// =~ /a/'
# -e:1: syntax error, unexpected tMATCH
# %Q/a// =~ /a/
# ^
答案 1 :(得分:2)
原来它既不是Ruby也不是Rails,而是一个名为awesome_print的宝石,它是猴子修补Ruby的grep方法。我使用的旧版本必须有一些bug。升级到最新版本1.0.2可以解决问题。