如果我想在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