Как добавить один символ обратной косой черты в строку в Ruby? - PullRequest
11 голосов
/ 04 апреля 2009

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

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

Ответы [ 3 ]

14 голосов
/ 04 апреля 2009

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

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

Это включает в себя последовательность \', что означает «все, что я соответствовал».

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

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

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

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

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

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

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

puts s.gsub("'", /\\'/.source)
children\'s world
4 голосов
/ 04 апреля 2009
>> puts s.gsub("'", "\\\\'")
children\'s world
1 голос
/ 04 апреля 2009

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

s.gsub("'") {"\\'"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...