Как проверить, существует ли именованная группа в объекте MatchData? - PullRequest
7 голосов
/ 07 апреля 2011
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 для проверки существования именованной группы.Есть ли другой способ проверить?

Ответы [ 3 ]

15 голосов
/ 07 апреля 2011
result.names.include? 'mtch'
# => true
result.names.include? 'fail'
# => false
0 голосов
/ 07 апреля 2011

Просто проверьте сопоставленные данные, используя p. В вашем случае пример уже показывает, что у вас есть.

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

Это означает, что вся соответствующая строка равна "test", а инвентарь имени (только) mtch. Если бы оно имело другое имя, оно было бы включено в эту форму.

0 голосов
/ 07 апреля 2011
result["fail"] rescue false

- это один простой способ.Есть более элегантные способы, но модификатор спасения часто оказывается полезным, он прост, если вы не хотите обращать внимание на создаваемые исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...