簡體   English   中英

Ruby Regexp插值/字符類/全局變量語法沖突?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM