/ / Bonne façon d'extraire plusieurs valeurs de la chaîne en utilisant l'expression régulière dans ruby ​​1.8 - ruby, regex, string, ruby-1.8

La bonne façon d'extraire plusieurs valeurs de la chaîne en utilisant l'expression régulière dans ruby ​​1.8 - ruby, regex, string, ruby-1.8

Je suis relativement nouveau au rubis et j'essaie decomprendre la façon "ruby" d'extraire plusieurs valeurs d'une chaîne, basée sur le regroupement en expressions régulières. J'utilise ruby ​​1.8 (donc je ne pense pas avoir nommé de captures).

Je pourrais juste faire correspondre et ensuite affecter 1 $, 2 $ - mais j'ai l'impression qu'il doit y avoir une manière plus élégante (c'est du rubis, après tout).

J'ai aussi quelque chose qui fonctionne avec grep, mais cela semble hackeux puisque j'utilise un tableau et que je saisis juste le premier élément:

input="FOO: 1 BAR: 2"
foo, bar = input.grep(/FOO: (d+) BAR: (d+)/){[$1,$2]}[0]
p foo
p bar

"J'ai essayé de chercher en ligne et de parcourir le ruby docs, mais je n'ai rien trouvé de mieux.

Réponses:

3 pour la réponse № 1

Rubys Correspondance chaîne # méthode retourne un MatchData objet avec la méthode capture pour renvoyer un tableau de captures.

>> string = "FOO: 1 BAR: 2"
=> "FOO: 1 BAR: 2"
>> string.match /FOO: (d+) BAR: (d+)/
=> #<MatchData "FOO: 1 BAR: 2" 1:"1" 2:"2">
>> _.captures
=> ["1", "2"]
>> foo, bar = _
=> ["1", "2"]
>> foo
=> "1"
>> bar
=> "2"

Résumer:

foo, bar = input.match(/FOO: (d+) BAR: (d+)/).captures

1 pour la réponse № 2

Non plus:

foo, bar = string.scan(/[A-Z]+: (d+)/).flatten

ou:

foo, bar = string.match(/FOO: (d+) BAR: (d+)/).captures

1 pour la réponse № 3

Utilisez plutôt scan:

input="FOO: 1 BAR: 2"

input.scan(/FOO: (d+) BAR: (d+)/) #=> [["1", "2"]]