我试图查看字符串s
是否包含正则表达式中的任何符号。以下正则表达式适用于rubular。
s = "asd#d"
s =~ /[~!@#$%^&*()]+/
但在Ruby 1.9.2中,它给出了以下错误消息:
syntax error, unexpected ']', expecting tCOLON2 or '[' or '.'
s = "asd#d"; s =~ /[~!@#$%^&*()]/
有什么问题?
答案 0 :(得分:12)
这实际上是使用全局和实例变量进行字符串插值的一种特殊情况,大多数人似乎都不知道。由于字符串插值也出现在Ruby中的正则表达式中,我将在下面用字符串说明(因为它们提供了一个更简单的示例):
@foo = "instancefoo"
$foo = "globalfoo"
"#@foo" # => "instancefoo"
"#$foo" # => "globalfoo"
因此,您需要转义#
以防止其被插值:
/[~!@\#$%^&*()]+/
我知道在Ruby中创建非插值正则表达式的唯一方法是使用字符串(注意单个引号):
Regexp.new('[~!@#$%^&*()]+')
答案 1 :(得分:1)
我能够在1.9.3p0中复制此行为。显然'#$'组合存在问题。如果你逃脱它是否有效。如果你反转它们就可以了:
s =~ /[~!@$#%^&*()]+/
编辑:在Ruby 1.9中#$
调用变量插值,即使后面跟着一个不是有效变量名的%
。
答案 2 :(得分:-3)
我不同意,你需要逃避$,它是字符串字符的结尾。
s =~ /[~!@#\$%^&*()]/ => 3
这是正确的。