Ruby Regexp插值/字符类/全局变量语法冲突?

Ruby Regexp插值/字符类/全局变量语法冲突?,ruby,regex,Ruby,Regex,为什么会发生这种错误 Regexp.new("[#$]") # => SyntaxError: (irb):1: syntax error, unexpected $undefined # => Regexp.new("[#$]") # ^ # (irb):1: unterminated string meets end of file # from ~/.rvm/rubies/ruby-1.9.3-p

为什么会发生这种错误

    Regexp.new("[#$]")
    # => SyntaxError: (irb):1: syntax error, unexpected $undefined
    # => Regexp.new("[#$]")
    #              ^
    # (irb):1: unterminated string meets end of file
    #     from ~/.rvm/rubies/ruby-1.9.3-p194/bin/irb:1:in `<main>'

问题不是
$
,而是
#
,因为
#…
通常用于双引号字符串中的变量展开。比如
“#{x}”

但问题是,您也可以直接使用
#$global
展开全局变量,这就解释了您的问题:

$global = "hello"
"#$global"
=> "hello"
因此,解决方案是避开
#
$
,因为这将使字符串插值状态机无法将构造解释为插值:

puts "\#$global"
=> #$global
puts "#\$global"
=> #$global
编辑

要明确一点:)问题不在于
Regexp
,而是在键入
“#$]”时试图展开名为
$]
的全局变量:

要修复它,您需要逃避一些事情:

puts "\#$]"
=> #$]

@muistooshort的可能重复项:是的,你是对的:两个问题的答案都相同。我不怪你没有找到它,搜索
$
并没有什么帮助。+1,但你不能通过交换符号的位置(即
[$\35;]
)来解决问题吗?我对Ruby不是很熟练,但是根据文档
#
被视为一个文字,除非后面跟着
{
$
,或者
@
@Alanmore-是的,重新排序也解决了这个问题。OP在他的文本中也指出了这一点“…排序很重要…”.我不知道这意味着什么,但字符类中字符的顺序不可能很重要(除了那些具有特殊含义的字符,例如
^
-
,也就是说).Alan我解释了它,因此OP已经注意到重新排序
$
#
可以解决问题。但是他仍然在寻找问题发生的原因的答案。在字符类中排序并不重要,就像你说的(除非你遇到这个特殊问题)。
puts "#$]"
SyntaxError: (irb):22: syntax error, unexpected $undefined
puts "\#$]"
=> #$]