2015-04-03 26 views
1

如果我想在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.==嘟囔什麼「字符集」和「模式」需要是相同的,但幫忙,不提什麼「字符集」和「模式」。

+0

在Ruby 2.2.1 '/ \ // ==%r {/}'產生'true'。哈希匹配也是如此。 – 2015-04-03 18:40:14

+0

@PhilipHallstrom:啊,是的。好決定。我正在測試這些根據1.9.3 – pje 2015-04-03 18:42:02

回答

1

使用Ruby 1.9.3-P551,兩個Regexp對象的source是不同的:

1.9.3-p551 :001 > /\//.source 
=> "\\/" 
1.9.3-p551 :002 > %r{/}.source 
=> "/" 

Regexp#==compares the source平等檢查時。

Regexp#hashincludes the source在散列碼計算中。

使用Ruby 2.0.0-P0和以後,文字兩個正則表達式對象斜槓分隔文字匹配,所述百分比-R語法和的source相等:

2.0.0-p0 :001 > /\//.source 
=> "/" 
2.0.0-p0 :002 > %r{/}.source 
=> "/" 
2.0.0-p0 :003 > /\// == %r{/} 
=> true 
+0

是的,就是這樣。謝謝!你不知道哪個版本的ruby改變了這種行爲,是嗎? – pje 2015-04-03 18:59:13

+0

@pje它看起來像在Ruby 2.0.0-P0中發生的變化。 – 2015-04-03 19:01:59