При использовании регулярных выражений в Ruby, в чем разница между $1 и\1?
$ 1 и \1 в Ruby
Ответ 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'