$1 and \1 in Ruby

RubyRegex

Ruby Problem Overview


When using regular expressions in Ruby, what is the difference between $1 and \1?

Ruby Solutions


Solution 1 - Ruby

\1 is a backreference which will only work in the same sub or gsub method call, e.g.:

"foobar".sub(/foo(.*)/, '\1\1') # => "barbar"

$1 is a global variable which can be used in later code:

if "foobar" =~ /foo(.*)/ then 
  puts "The matching word was #{$1}"
end

Output:

"The matching word was bar"
# => nil

Solution 2 - Ruby

Keep in mind there's a third option, the block form of sub. Sometimes you need it. Say you want to replace some text with the reverse of that text. You can't use $1 because it's not bound quickly enough:

"foobar".sub(/(.*)/, $1.reverse)  # WRONG: either uses a PREVIOUS value of $1, 
                                  # or gives an error if $1 is unbound

You also can't use \1, because the sub method just does a simple text-substitution of \1 with the appropriate captured text, there's no magic taking place here:

"foobar".sub(/(.*)/, '\1'.reverse) # WRONG: returns '1\'

So if you want to do anything fancy, you should use the block form of sub ($1, $2, $`, $' etc. will be available):

"foobar".sub(/.*/){|m| m.reverse} # => returns 'raboof'
"foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns 'oofrab'

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionreadonlyView Question on Stackoverflow
Solution 1 - RubyAvdiView Answer on Stackoverflow
Solution 2 - RubyBrian CarperView Answer on Stackoverflow