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

时间:2012-02-29 03:15:54

标签: ruby regex

我试图查看字符串s是否包含正则表达式中的任何符号。以下正则表达式适用于rubular

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

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

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

有什么问题?

3 个答案:

答案 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

这是正确的。