J'essaye actuellement de réexprimer une chaîne en plusieurs variables. Exemple de chaîne:
ryan_string = "RyanOnRails: This is a test"
Je l'ai mis en correspondance avec cette expression rationnelle, avec 3 groupes:
ryan_group = ryan_string.scan(/(^.*)(:)(.*)/i)
Maintenant, pour accéder à chaque groupe, je dois faire quelque chose comme ceci:
ryan_group[0][0] (first group) RyanOnRails
ryan_group[0][1] (second group) :
ryan_group[0][2] (third group) This is a test
Cela semble assez ridicule et j'ai l'impression de faire quelque chose de mal. Je m'attendrais à être capable de faire quelque chose comme ceci:
g1, g2, g3 = ryan_string.scan(/(^.*)(:)(.*)/i)
Est-ce possible? Ou y a-t-il une meilleure façon que la façon dont je le fais?
la source
one, two, three = string.match(/(^.*)(:)(.*)/i).captures
en:one, two, three = string.match(/(^.*)(:)(.*)/i).try(:captures)
&.
opérateur pour le remettre sur une ligne et même l'utiliser deux fois lorsqu'il n'y a qu'un seul groupe de capture. Par exemple.,string.match(regex)&.captures&.first
Vous pouvez utiliser Match ou = ~ à la place, ce qui vous donnerait une seule correspondance et vous pourriez soit accéder aux données de correspondance de la même manière, soit simplement utiliser les variables de correspondance spéciales $ 1, $ 2, $ 3
Quelque chose comme:
la source
Vous pouvez nommer vos matchs capturés
Cela ne fonctionne pas si vous inversez l'ordre de la chaîne et de l'expression régulière.
la source
Vous devez décider si c'est une bonne idée, mais ruby regexp peut (automatiquement) définir des variables locales pour vous!
Je ne sais pas encore si cette fonctionnalité est géniale ou tout simplement totalement folle, mais votre regex peut définir des variables locales.
(Jetez un œil à http://ruby-doc.org/core-2.1.1/Regexp.html , recherchez "variable locale").
Remarque: comme indiqué dans un commentaire, je vois qu'il existe une réponse similaire et antérieure à cette question de @toonsend ( https://stackoverflow.com/a/21412455 ). Je ne pense pas que je «volais», mais si vous voulez être juste avec les louanges et honorer la première réponse, n'hésitez pas :) J'espère qu'aucun animal n'a été blessé.
la source
scan()
trouvera toutes les correspondances non chevauchantes de l'expression régulière dans votre chaîne, donc au lieu de renvoyer un tableau de vos groupes comme vous semblez vous y attendre, il renvoie un tableau de tableaux.Vous feriez probablement mieux d'utiliser
match()
, puis d'obtenir le tableau de captures en utilisantMatchData#captures
:Cependant, vous pouvez également le faire avec
scan()
si vous le souhaitez:la source