2014-10-03 44 views
1

两个表达式:匹配方法和=〜运算符有什么区别?

puts "String has vowels" if "This is a test".match(/[aeiou]/) 

puts "String has vowels" if "This is a test" =~ /[aeiou]/ 

似乎相同。他们不是?我做了下面的一些测试:

"This is a test" =~ /[aeiou]/ 
# => 2 

"This is a test".match(/[aeiou]/) 
# => MatchData "i" 

所以好像=~为您提供了第一场比赛的位置和match方法为您提供了相匹配的第一个字符。它是否正确?他们都返回true,那么这里有什么不同?

+2

做什么[的文档(HTTP快一点少于三次:// WWW .ruby-doc.org/core-2.1.3/Regexp.html)说? – 2014-10-03 23:24:53

+0

这个问题没有多大意义。正如您注意到的,当您将它们嵌入到条件中时,差异会消失,但这并不意味着它们本身并不相同。 – sawa 2014-10-04 04:27:09

+0

嗯....等等,当两个表达式都处于条件时没有区别。只有当他们从有条件的否定中被带出时才会产生差异? – Jwan622 2014-10-04 17:49:12

回答

2

他们只是的不同是什么,他们返回如果有匹配。如果没有匹配,则返回nil

~=返回字符串中的字符的数字指标在比赛开始
.match返回类MatchData

+0

我尝试阅读关于这个MatchData类。为什么它们都是#格式?我试着阅读文档,但我还是不明白... – Jwan622 2014-10-04 17:50:19

1

你是正确的实例。

扩展在大雄的答案,match如果你想只检查是否一个字符串(在你的情况等)相匹配的正则表达式效率较低。在这种情况下,您应该使用=~。查看答案"Fastest way to check if a string matches or not a regexp in ruby?",其中包含这些基准测试:

require 'benchmark' 

"test123" =~ /1/ 
=> 4 
Benchmark.measure{ 1000000.times { "test123" =~ /1/ } } 
=> 0.610000 0.000000 0.610000 ( 0.578133) 

... 

irb(main):019:0> "test123".match(/1/) 
=> #<MatchData "1"> 
Benchmark.measure{ 1000000.times { "test123".match(/1/) } } 
=> 1.703000 0.000000 1.703000 ( 1.578146) 

因此,在这种情况下,=~match

+0

+1的基准! – Nobita 2014-10-04 01:14:18

+0

我对你测试的两个表达式以及''test123“[/ 1 /]'(它返回'1')运行了一个基准测试。对于它的价值,后者的“总”结果经过调整后与结果相当,大约为0.766秒。 – 2014-10-04 01:35:26

相关问题