Я не могу ни за что в жизни понять это, даже при том, что это должно быть очень просто.
Как я могу заменить все случаи "("
и ")"
на строке с "\("
и "\)"
?
Ничто, кажется, не работает:
"foo ( bar ) foo".gsub("(", "\(") # => "foo ( bar ) foo"
"foo ( bar ) foo".gsub("(", "\\(") # => "foo \\( bar ) foo"
Какая-либо идея?
Вы уже нашли решение со второй попытки, вы просто запутались, потому что в интерактивном интерпретаторе строка отображается в экранированном виде. Но на самом деле там только одна обратная косая черта, а не две. Попробуйте напечатать ее с помощью puts, и вы увидите, что на самом деле там только один обратный слеш:
> "foo ( bar ) foo".gsub("(", "\\(")
=> "foo \\( bar ) foo"
> puts "foo ( bar ) foo".gsub("(", "\\(")
foo \( bar ) foo
Если вам нужно еще больше убедительности, попробуйте взять длину строки:
> "foo ( bar ) foo".length
=> 15
> "foo ( bar ) foo".gsub("(", "\\(").length
=> 16
Если бы она добавила два обратных слеша, она бы вывела 17, а не 16.
В строке, созданной с использованием двойных кавычек, \
экранирует следующий символ. Итак, чтобы получить обратную косую черту в строке, вам нужно избежать самой обратной косой черты: "\\ ("
. Или вы можете просто использовать строку в одинарных кавычках, которая требует меньше предварительной обработки: '\ ('
.
"foo ( bar ) foo".gsub("(", "\\\\(")
действительно работает. Если вы пробуете это в консоли, вы, вероятно, видите \\\(
строку, потому что консоль выводит строку с inspect, который экранирует \
Попробуйте с: puts "foo ( bar ) foo".gsub("(", "\\\(")
и вы увидите