2013-01-15 67 views
11

我正在使用Ruby 1.9.3。我與一些模式玩,發現一些有趣的事情:模式匹配時=〜和match()有什麼區別?

例1:

irb(main):001:0> /hay/ =~ 'haystack' 
=> 0 
irb(main):003:0> /st/ =~ 'haystack' 
=> 3 

例2:

irb(main):002:0> /hay/.match('haystack') 
=> #<MatchData "hay"> 
irb(main):004:0> /st/.match('haystack') 
=> #<MatchData "st"> 

=~返回它的第一場比賽的第一個位置,而match返回模式。除此之外,=~match()之間是否有區別?

執行時間差(按@Casper)

irb(main):005:0> quickbm(10000000) { "foobar" =~ /foo/ } 
Rehearsal ------------------------------------ 
    8.530000 0.000000 8.530000 ( 8.528367) 
--------------------------- total: 8.530000sec 

     user  system  total  real 
    8.450000 0.000000 8.450000 ( 8.451939) 
=> nil 

irb(main):006:0> quickbm(10000000) { "foobar".match(/foo/) } 
Rehearsal ------------------------------------ 
    15.360000 0.000000 15.360000 (15.363360) 
-------------------------- total: 15.360000sec 

     user  system  total  real 
    15.240000 0.010000 15.250000 (15.250471) 
=> nil 
+2

爲什麼下投票:

do_stuff if "foobar" =~ /foo/ do_stuff if "foobar".match(/foo/) # same effect, but probably slower and harder to read 

match當您想了解什麼是匹配的細節,通常使用我得到了? – DoLoveSky

+0

'operator'和'method'都可能做同樣的事情,但是它們的功能差別太大了 - 這兩個帖子都帶有太多的信息,這對於所有SO用戶來說都是非常棒的,有用的知識信息。儘管所有這些我得到了投票意味着對我來說真的很糟糕!我沒有想到這是來自論壇。 – DoLoveSky

+1

我並沒有讓你失望,但我想這是因爲寫作的問題是中等荒謬的。你發現有多個方法可以做類似的事情,但是每個方法都會返回不同的結果。爲什麼這很有趣? Ruby(和大多數編程語言)中有很多方法可以做類似的事情,但返回不同的結果。 – Phrogz

回答

7

首先確保您使用的是正確的操作:=~是正確的,~=不是。

=~返回第一個匹配的索引(nil如果沒有匹配),並且存儲所述MatchData在全局變量$~操作者。命名的捕獲組被分配到$~上的散列,並且當RegExp是運算符左側的文字時,也被分配給具有這些名稱的局部變量。

>> str = "Here is a string" 
>> re = /(?<vowel>[aeiou])/ # Contains capture group named "vowel" 
>> str =~ re 
=> 1 
>> $~ 
=> #<MatchData "e" vowel:"e"> 
>> $~[:vowel] # Accessible using symbol... 
=> "e" 
>> $~["vowel"] # ...or string 
=> "e" 
>> /(?<s_word>\ss\w*)/ =~ str 
=> 9 
>> s_word # This was assigned to a local variable 
=> " string" 

match返回MatchData本身(再次,nil如果沒有匹配)的方法。在這種情況下,在方法調用的任一側命名的捕獲組被分配到返回的MatchData上的散列。

>> m = str.match re 
=> #<MatchData "e" vowel:"e"> 
>> m[:vowel] 
=> "e" 

詳情請參閱http://www.ruby-doc.org/core-1.9.3/Regexp.html(以及對MatchData的章節和String)。

+0

'+ 1'給你!你的發現是完美的,理解!但我仍然對混淆了'哈希'你想說什麼!你能用一個代碼或其他的東西來解釋嗎?這樣你的想法就能被我看到!請致電 – DoLoveSky

+0

@DoLoveSky使用irb編輯一些輸出。 – iamnotmaynard

+0

@DoLoveSky我強烈建議你閱讀我的答案中引用的紅寶石文檔。那裏有更多的信息可能會非常有幫助。 – iamnotmaynard

3

如果您有一個不修改狀態的方法,那麼所有重要的是返回值。那麼除了顏色之外,紅色和藍色之間還有什麼區別?我的觀點是,這是一個奇怪的問題,你似乎已經知道答案。 (@sawa直接在這裏設置我)

但這就是說,當正則表達式不匹配時,兩種方法都會返回nil(一個虛假值)。而且,兩種方法在匹配時都會返回一個真值。 =~返回一個整數,表示匹配的第一個字符,即使這是0,因爲0在Ruby中是truthy。 match返回一個非常詳細的匹配數據的對象,這是很方便的,當你想要很多關於匹配的信息。

=~通常用於條件語句,當你只關心如果東西相匹配:

name = "name:bob".match(/^name:(\w+)$/)[1] 
puts name #=> 'bob' 
+0

'+ 1'給你!很好的解釋。你提供給我的很多信息。非常感謝你! – DoLoveSky

+1

單獨第一段+1。 (其餘的也很好。:) – Phrogz

+1

重要的不僅僅是回報價值。還有一件事:速度。原則上可能的(但事實並非如此)'匹配'比'=〜'計算更廣泛,所以這可能是決定使用哪一個因素的一個因素。這不是一個奇怪的問題。我不認爲你的紅色與藍色的爭論是有道理的。 – sawa

相關問題