Подтвердить что ты не робот

$ 1 и \1 в Ruby

При использовании регулярных выражений в Ruby, в чем разница между $1 и\1?

4b9b3361

Ответ 1

\ 1 - это обратная ссылка, которая будет работать только в одном вызове метода sub или gsub, например:

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

$1 - глобальная переменная, которая может использоваться в более позднем коде:

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

Вывод:

"The matching word was bar"
# => nil

Ответ 2

Помните, что есть третий вариант, блочная форма sub. Иногда вам это нужно. Предположим, вы хотите заменить какой-либо текст обратным текстом. Вы не можете использовать $1, потому что он не привязан достаточно быстро:

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

Вы также не можете использовать \1, потому что метод sub просто выполняет текстовую подстановку \1 с соответствующим захваченным текстом, здесь нет волшебства:

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

Итак, если вы хотите сделать что-нибудь интересное, вы должны использовать форму блока sub ($ 1, $2, $`, $'и т.д.):

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