如果我想在ruby中編寫簡單的正則表達式來匹配斜線文字(/
,U + 002F),我可以使用兩個語法形式。斜槓分隔的文字用反斜槓轉義反斜槓字符:紅寶石1.9.3正則表達式#==:相同的模式,不同的語法,不同的相等
/\//
,或者使用「百分比-R」的語法,其中沒有必要逃避斜線:
%r{/}
所以,我的問題:在Ruby 1.9.3中,爲什麼這兩個「等價」的正則表達式不相等?
>> /\// == %r{/}
=> false
他們match
相同字符串:
>> /\//.match('/')
=> #<MatchData "/">
>> %r{/}.match('/')
=> #<MatchData "/">
他們inspect
相同:
>> /\//
=> /\//
>> %r{/}
=> /\//
他們to_s
相同:
>> /\//.to_s
=> "(?-mix:\\/)"
>> %r{/}.to_s
=> "(?-mix:\\/)"
但是他們不一樣hash
!
>> /\//.hash
=> -913497737416042053
>> %r{/}.hash
=> 1283138729813860088
那麼...他們怎麼樣?它有事情做與反斜槓轉義字符,因爲:
>> %r{\/} == %r{\/}
=> true
>> %r{/} == %r{\/}
=> false
Ruby的documentation on Regexp.==
嘟囔什麼「字符集」和「模式」需要是相同的,但幫忙,不提什麼「字符集」和「模式」。
在Ruby 2.2.1 '/ \ // ==%r {/}'產生'true'。哈希匹配也是如此。 – 2015-04-03 18:40:14
@PhilipHallstrom:啊,是的。好決定。我正在測試這些根據1.9.3 – pje 2015-04-03 18:42:02