2011-04-07 113 views
7
ruby-1.9.2-p180 :003 > result = "test string".match(/(?<mtch>test)/) 
=> #<MatchData "test" mtch:"test"> 
ruby-1.9.2-p180 :011 > result["mtch"] 
=> "test" 
ruby-1.9.2-p180 :012 > result["fail"] 
IndexError: undefined group name reference: fail 
    from (irb):12:in `[]' 
    from (irb):12 
    from /Users/jeremysmith/.rvm/rubies/ruby-1.9.2-p180/bin/irb:16:in `<main>' 

沒有用於檢查命名組是否存在的MatchData函數。有其他方法可以檢查嗎?如何檢查MatchData對象中是否存在命名組?

回答

15
result.names.include? 'mtch' 
# => true 
result.names.include? 'fail' 
# => false 
0
result["fail"] rescue false 

是一種簡單的方法。有更多優雅的方法,但救援修改器通常很方便,如果你不想注意拋出的異常,這很簡單。

+0

這被認爲是不好的做法? – 2011-04-07 18:45:08

+0

取決於。有時候你真的不在乎是否有例外(比如你知道沒有比賽會導致一場比賽)。我謹慎使用它,但我不認爲它是不好的風格。 – EdvardM 2011-04-07 18:56:27

+0

但是使用result.names.include?像Mladen所建議的那樣,IMO要好得多。 – EdvardM 2011-04-07 18:57:52

0

只需使用p檢查匹配的數據。在你的情況下,這個例子已經顯示你有什麼。

=> #<MatchData "test" mtch:"test"> 

這意味着匹配整個字符串是"test",和名字的清單是(僅)mtch。如果它有其他名字,它將被包含在這個表格中。

相關問題