49 votes

1 $ et \ 1 en rubis

Lors de l'utilisation d'expressions régulières en Ruby, quelle est la différence entre $ 1 et \ 1?

81voto

Avdi Points 13086

\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")

29voto

Brian Carper Points 40078

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'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X