Как добавить один символ обратной косой черты в строку в Ruby?

Я хочу вставить обратную косую черту перед апострофом в строку "children world". Есть ли простой способ сделать это?

irb(main):035:0> s = "children world"
=> "children world"
irb(main):036:0> s.gsub('\'', '\\\'')
=> "childrens worlds world"

Ответ 1

из ruby-doc.org о шаблоне замены для gsub:

последовательности\1,\2 и т.д. могут использоваться для интерполяции последовательных групп в матче

Это включает в себя последовательность \', что означает "все, что соответствует тому, что я сопоставил".

Либо "\\'", либо '\\\'' будут выдавать \' (помните, что \ должен быть экранирован как в двойных, так и в одинарных кавычках, а ' должен быть экранирован в однокасканных строках, поэтому использование одинарных кавычек в этом случае фактически делает вещи более подробными). Например:.

puts "before*after".gsub("*", "\\'")
"beforeafterafter"

puts "before*after".gsub("*", '\\\'')
"beforeafterafter"

То, что вы хотите видеть gsub, на самом деле \\', которое может быть создано как "\\\\'", так и '\\\\\''. Итак:

puts s.gsub("'", "\\\\'")
children\ world

puts s.gsub("'", '\\\\\'')
children\ world

или если вам нужно много сделать с \, вы можете воспользоваться тем фактом, что при использовании /.../ (или %r{...}) вам не нужно удваивать escape-обратную косую черту:

puts s.gsub("'", /\\'/.source)
children\ world

Ответ 2

>> puts s.gsub("'", "\\\\'")
children\ world

Ответ 3

Ваша проблема в том, что строка "\" имеет смысл для gsub в заменяющей строке. Чтобы заставить его работать так, как вы хотите, вы должны использовать форму блока.

s.gsub("'") {"\\'"}