2011-04-07 9 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>' 

No es una función MatchData para comprobar si existe un grupo llamado. ¿Hay alguna otra forma de verificar?¿Cómo puedo verificar si existe un grupo con nombre en un objeto MatchData?

Respuesta

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

es una manera simple. Hay formas más elegantes, pero el modificador de rescate suele ser práctico, es simple si no quieres prestar atención a las excepciones lanzadas.

+0

¿Es esta mala práctica en cuenta? –

+0

Depende. A veces, realmente no te importa si hubo una excepción (como cuando sabes que no tener una coincidencia causa una). Lo uso con moderación, pero no lo considero un mal estilo. – EdvardM

+0

¿Pero usando result.names.include? es mucho mejor, OMI, como sugirió Mladen. – EdvardM

0

Sólo inspeccionar combinado de datos mediante el uso de p. En tu caso, el ejemplo ya muestra lo que tienes.

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

Esto significa que toda la cadena que corresponde es "test", y el inventario del nombre es (sólo) mtch. Si tuviera algún otro nombre, se incluiría en esta forma.

Cuestiones relacionadas