被一个简单的正则表达困扰
我试图看看字符串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
那是正确的。