С документация Ruby :
Аналогично \&
, \'
, \`
и \+
соответствуют специальным переменным, $&
, $'
, $`
и $+
соответственно.
И здесь , в документации говорится:
$~
эквивалентно :: last_match ; $&
содержит полный сопоставленный текст; $`
содержит строку перед совпадением; $'
содержит строку после совпадения; $1
, $2
и т. Д. Содержат сопоставление текста первой, второй и т. Д. c группы захвата; $+
содержит последнюю группу захвата.
Пример:
m = /s(\w{2}).*(c)/.match('haystack') #=> #<MatchData "stac" 1:"ta" 2:"c">
$~ #=> #<MatchData "stac" 1:"ta" 2:"c">
Regexp.last_match #=> #<MatchData "stac" 1:"ta" 2:"c">
$& #=> "stac"
# same as m[0]
$` #=> "hay"
# same as m.pre_match
$' #=> "k"
# same as m.post_match
$1 #=> "ta"
# same as m[1]
$2 #=> "c"
# same as m[2]
$3 #=> nil
# no third group in pattern
$+ #=> "c"
# same as m[-1]
Таким образом, \'
в строке замены замены имеет особое значение. Это означает «Часть исходной строки после совпадения», которая в данном случае равна "bc"
.
Так что вместо получения \'Bbc
вы получите bcBbc
Поэтому, к сожалению, в этом странном сценарии вам необходимо удвоить - избежать обратной косой черты:
puts 'abc'.sub('a',"\\\\'B") => "\'Bbc"