Je cherche un raccourci pour le fragment de rubis suivant:
var = "foo 123 456 789 bar";
var =~ /^foo +(d+) +(d+) +(d+) +bar$/;
first=$1
second=$2
third=$3
Il me semble qu'il y a certainement quelque chose comme (first, second, third) = ....
mais je n'ai aucune idée avec quel terme je pourrais aller le chercher.
Réponses:
3 pour la réponse № 1Si tu utilises match
au lieu de =~
, vous récupérez un MatchData
objet, qui a une méthode captures
, qui renvoie les valeurs correspondantes par les groupes de capture dans un tableau:
first, second, third = var.match(/.../).captures
3 pour la réponse № 2
Une autre façon, que vous pouvez aller:
var = "foo 123 456 789 bar"
/^foo +(?<first>d+) +(?<second>d+) +(?<third>d+) +bar$/ =~ var
Cela attribue automatiquement les captures aux variables locales.
Remarque: str =~ regexp
ne fonctionnera pas ici. Seulement regexp =~ str
.
Pour autant que je sache, il s’agit d’une fonctionnalité du moteur Oniguruma, donc elle fonctionne dans la version 1.9.
http://www.ruby-doc.org/ruby-1.9/classes/Regexp.html#M001100
1 pour la réponse № 3
str = "foo 123 456 789 bar"
re = /^foo +(d+) +(d+) +(d+) +bar$/
p re.match(str).to_a
#=> ["foo 123 456 789 bar", "123", "456", "789"]
_, a, b, c = re.match(str).to_a
p [a,b,c]
#=> ["123", "456", "789"]
Notez que Regex#match
reviendra nil
si aucune correspondance n'est trouvée, mais nil.to_a
retourne un tableau vide, ce qui précède est sans danger.