2011-04-07 62 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。如果它有其他名字,它将被包含在这个表格中。