2014-10-03 76 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

相關問題