2015-04-03 21 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