5

为什么会出现这个错误?

    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>'

这应该从字面上描述由单个$or组成的字符串子集。#而且,AFAIU Ruby 的 Regexp 引擎,即使它们通常是元字符,也不需要在字符类#$ 进行转义。

我会从错误消息中猜出 Ruby 试图在双引号内进行插值,但是......为什么$#订购很重要。和字符有多个重载行为$#所以我不知道是什么触发了这个。

PS,仅供参考:

    /[#$]/
    # => SyntaxError: (irb):1: syntax error, unexpected $undefined
    /[$#]/
    # => /[$#]/
    Regexp.new '[$#]'
    # => /[$#]/
    Regexp.new '[#$]'
    # => /[#$]/
    Regexp.new "[#$]"
    # => SyntaxError: (irb):1: syntax error, unexpected $undefined
4

1 回答 1

7

问题不是$, 而是#,因为#...它通常用于双引号字符串中的变量扩展。喜欢"#{x}"

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

$global = "hello"
"#$global"
=> "hello"

所以解决方案是转义or # $因为这将破坏字符串插值状态机,使其无法将构造解释为插值:

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

编辑

只是为了说清楚:)问题不在于Regexp,而是您试图扩展一个$]在键入时命名的全局变量"#$]"

puts "#$]"
SyntaxError: (irb):22: syntax error, unexpected $undefined

要修复它,您需要逃避一些东西:

puts "\#$]"
=> #$]
于 2012-05-23T18:01:10.957 回答