为什么会出现此错误?
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>'
这应该描述字符串的子集,包括单个$或#,字面意思.并且,AFAIU Ruby’s Regexp engine,#和$don’t need to be escaped在一个角色类中,即使它们通常是元字符.
我会从错误消息中猜测Ruby正在尝试插入$当它在双引号内打#时,但是……为什么?订购很重要. $和#字符有多个重载行为,所以我不知道是什么触发了这个.
PS,FYI:
/[#$]/ # => SyntaxError: (irb):1: Syntax error,unexpected $undefined /[$#]/ # => /[$#]/ Regexp.new '[$#]' # => /[$#]/ Regexp.new '[#$]' # => /[#$]/ Regexp.new "[#$]" # => SyntaxError: (irb):1: Syntax error,unexpected $undefined
解决方法
问题不是$,而是#,因为#…通常用于双引号字符串中的变量扩展.比如“#{x}”.
但问题是你还可以使用#$global直接扩展全局变量,这解释了你的问题:
$global = "hello" "#$global" => "hello"
因此解决方案是转义#或$,因为这会破坏字符串插值状态机,因为它将构造解释为插值的努力:
puts "\#$global" => #$global puts "#\$global" => #$global
编辑
并且只是为了让它变得非常清楚:)问题不在于Regexp,而是在输入“#$”时尝试扩展名为$]的全局变量:
puts "#$]" SyntaxError: (irb):22: Syntax error,unexpected $undefined
要解决它,你需要逃避一些事情:
puts "\#$]" => #$]