Ruby 1.9.3 Regexp#==:相同的模式,不同的语法,不同的等式

时间:2015-04-03 18:28:10

标签: ruby regex

如果我想在ruby中编写一个简单的正则表达式以匹配斜杠文字(/,U + 002F),我可以使用两种语法形式来编写它。斜杠分隔的文字,带有反斜杠转义的斜杠字符:

/\//

或使用“percent-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.==嘟something了一些关于“字符集”和“模式”的东西需要相同,但有帮助的是没有提到“字符集”和“模式”是什么。

1 个答案:

答案 0 :(得分: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#hash includes the source

使用Ruby 2.0.0-p0及更高版本时,斜杠分隔文字的source与百分比-r语法文字的2.0.0-p0 :001 > /\//.source => "/" 2.0.0-p0 :002 > %r{/}.source => "/" 2.0.0-p0 :003 > /\// == %r{/} => true 相匹配,并且两个Regexp对象相等:

{{1}}