被一个简单的正则表达困扰

我试图看看字符串s包含正则表达式中的任何符号。 下面的正则表达式在rubular上运行正常 。

 s = "asd#d" s =~ /[~!@#$%^&*()]+/ 

但是在Ruby 1.9.2中,它给出了以下错误消息:

 syntax error, unexpected ']', expecting tCOLON2 or '[' or '.' s = "asd#d"; s =~ /[~!@#$%^&*()]/ 

怎么了?

这实际上是一个特殊的字符串插值案例,其中包含大多数人似乎都不知道的全局变量和实例变量。 由于字符串插值也出现在Ruby中的正则表达式中,我将在下面用字符串说明(因为它们提供了一个更简单的示例):

 @foo = "instancefoo" $foo = "globalfoo" "#@foo" # => "instancefoo" "#$foo" # => "globalfoo" 

因此,您需要转义#以防止它被插值:

 /[~!@\#$%^&*()]+/ 

我知道在Ruby中创建非插值正则表达式的唯一方法是使用字符串(注意引号):

 Regexp.new('[~!@#$%^&*()]+') 

我能够在1.9.3p0中复制这种行为。 显然’#$’组合存在问题。 如果你逃脱它是否有效。 如果你反转它们有效:

 s =~ /[~!@$#%^&*()]+/ 

编辑:在Ruby 1.9 #$调用变量插值,即使后面跟着一个不是有效变量名的%

我不同意,你需要逃避$,它是字符串字符的结尾。

 s =~ /[~!@#\$%^&*()]/ => 3 

那是正确的。