为什么Array#grep会使用斜杠抛出语法错误?

时间:2012-08-15 01:10:39

标签: ruby-on-rails ruby regex

以下命令适用于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/"]

2 个答案:

答案 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可以解决问题。