Lorsque vous utilisez des expressions régulières dans Ruby, quelle est la différence entre $ 1 et \ 1?
\ 1 est une référence arrière qui ne fonctionnera que dans le même appel de méthode sub
ou gsub
, par exemple:
"foobar".sub(/foo(.*)/, '\1\1') # => "barbar"
$ 1 est une variable globale utilisable dans le code suivant:
if "foobar" =~ /foo(.*)/ then puts "The matching word was #{$1}" end
Sortie:
"The matching word was bar" # => nil
N’oubliez pas qu’il existe une troisième option, la forme de bloc de sub
. Parfois, vous en avez besoin. Supposons que vous souhaitiez remplacer un texte par l’inverse de ce texte. Vous ne pouvez pas utiliser $ 1 car il n’est pas lié assez rapidement:
"foobar".sub(/(.*)/, $1.reverse) # WRONG: either uses a PREVIOUS value of $1, # or gives an error if $1 is unbound
Vous ne pouvez pas non plus utiliser \1
, car la sub
méthode ne fait qu’une simple substitution de texte par \1
avec le texte capturé approprié, il n’y a pas de magie ici:
"foobar".sub(/(.*)/, '\1'.reverse) # WRONG: returns '1\'
Donc, si vous voulez faire quelque chose de compliqué, vous devriez utiliser la forme de bloc de sub
($ 1, $ 2, $ `, $ ‘etc. seront disponibles):
"foobar".sub(/.*/){|m| m.reverse} # => returns 'raboof' "foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns 'oofrab'