如果我想在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了一些关于“字符集”和“模式”的东西需要相同,但有帮助的是没有提到“字符集”和“模式”是什么。
答案 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}}