Lors de l'utilisation d'expressions régulières en Ruby, quelle est la différence entre $ 1 et \ 1?
Réponses
Trop de publicités?\1 est une référence arrière qui ne fonctionne que dans le même sub
ou gsub
appel de méthode, par exemple:
"foobar".sub(/foo(.*)/, '\1\1') # => "barbar"
$1 est une variable globale qui peut être utilisé plus tard dans le code:
if "foobar" =~ /foo(.*)/ then
puts "The matching word was #{$1}"
end
(imprime "Le mot correspondant a bar")
Gardez à l'esprit qu'il ya une troisième option, la forme du bloc de l' sub
. Parfois, vous en avez besoin. Dites que vous voulez remplacer du texte à 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 aussi vous ne pouvez pas utiliser \1
, parce que l' sub
méthode ne fonctionne tout simplement un texte simple substitution d' \1
avec le texte capturé, il n'y a pas de magie ici:
"foobar".sub(/(.*)/, '\1'.reverse) # WRONG: returns '1\'
Donc, si vous voulez faire quelque chose de fantaisie, vous devez utiliser la forme du bloc de l' sub
($1, $2, $`, $' etc. sera disponible):
"foobar".sub(/.*/){|m| m.reverse} # => returns 'raboof'
"foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns 'oofrab'