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

Zab*_*bba 7 ruby regex

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

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

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

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

怎么了?

And*_*all 12

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

@foo = "instancefoo"
$foo = "globalfoo"
"#@foo" # => "instancefoo"
"#$foo" # => "globalfoo"
Run Code Online (Sandbox Code Playgroud)

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

/[~!@\#$%^&*()]+/
Run Code Online (Sandbox Code Playgroud)

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

Regexp.new('[~!@#$%^&*()]+')
Run Code Online (Sandbox Code Playgroud)

  • 为了将来参考,这是至少一本书中记录的行为:http://books.google.ca/books?id = jcUbTcr5XWwC&g = PA48&ltg = PA48&dq = ruby​​ + global + variable+interpolation&source = bl &ots = fIDnyi9zjG &sig = BcdcdRjtCnj3pj- PCtcMYh7UHS18&HL = EN&SA = X&EI = Ci29T8IJgZOJArLYzewN&VED = 0CFoQ6AEwAw#v = onepage&q =红宝石%20global%20variable%20interpolation&F =假 (2认同)