![](/img/trans.png)
[英]Is there any string syntax in Ruby that allows interpolation but no escape character?
[英]Ruby Regexp Interpolation / Character Class / Global Variable Syntax Clash?
為什么會出現此錯誤?
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的Regexp引擎 , #
和$
不需要在字符類中進行轉義,即使它們通常是元字符。
我會從錯誤消息中猜測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 "\#$]"
=> #$]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.