Je sais que je peux écrire une instruction de cas Ruby pour vérifier une correspondance avec une expression régulière. Cependant, j'aimerais utiliser les données de correspondance dans ma déclaration de retour. Quelque chose comme ce semi-pseudocode:
foo = "10/10/2011"
case foo
when /^([0-9][0-9])/
print "the month is #{match[1]}"
else
print "something else"
end
Comment puis-je y parvenir?
Merci!
Juste une note: je comprends que je n'utiliserais jamais une instruction switch pour un cas simple comme ci-dessus, mais ce n'est qu'un exemple. En réalité, ce que j'essaie de réaliser est la mise en correspondance de nombreuses expressions régulières potentielles pour une date qui peut être écrite de différentes manières, puis l'analyse avec la classe Ruby Date en conséquence.
ruby
regex
switch-statement
Yuval Karmi
la source
la source
Réponses:
Les références aux derniers groupes de correspondance regex sont toujours stockées dans des pseudo variables
$1
pour$9
:case foo when /^([0-9][0-9])/ print "the month is #{$1}" else print "something else" end
Vous pouvez également utiliser la
$LAST_MATCH_INFO
pseudo variable pour accéder à l'ensemble de l'MatchData
objet. Cela peut être utile lors de l'utilisation de captures nommées:case foo when /^(?<number>[0-9][0-9])/ print "the month is #{$LAST_MATCH_INFO['number']}" else print "something else" end
la source
$1
,$2
...$9
ouRegexp.last_match(1)
comme recommandé par rubocopVoici une approche alternative qui vous donne le même résultat mais n'utilise pas de commutateur. Si vous mettez vos expressions régulières dans un tableau, vous pouvez faire quelque chose comme ceci:
res = [ /pat1/, /pat2/, ... ] m = nil res.find { |re| m = foo.match(re) } # Do what you will with `m` now.
Déclarer en
m
dehors du bloc lui permet d'être toujours disponible après avoirfind
terminé avec le bloc etfind
s'arrêtera dès que le bloc renvoie une valeur vraie afin que vous obteniez le même comportement de raccourci qu'un commutateur vous donne. Cela vous donne le pleinMatchData
si vous en avez besoin (peut-être que vous voulez utiliser des groupes de capture nommés dans vos expressions régulières) et sépare bien vos expressions régulières de votre logique de recherche (qui peut ou non produire un code plus clair), vous pouvez même charger vos expressions rationnelles à partir d'un config ou choisissez l'ensemble d'entre eux que vous vouliez au moment de l'exécution.la source
case
approche. Peut-être souhaitez-vous utiliser l'approche de mu dans un scénario fileté, plutôt qu'une variable globale avec l'approche par cas (?)