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 "\#$]"
=> #$]