match方法和=〜运算符之间有什么区别?

时间:2014-10-03 23:02:21

标签: ruby match

两个表达式:

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 个答案:

答案 0 :(得分:2)

如果匹配,他们只会区别 。如果没有匹配,则返回nil

~=返回匹配开始的字符串中字符的数字索引 .match返回类MatchData

的实例

答案 1 :(得分:1)

你是对的。

扩展Nobita的答案,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

快三倍