Ruby - Круглая скобка Escape

Я не могу ни за что в жизни понять это, даже при том, что это должно быть очень просто.

Как я могу заменить все случаи "(" и ")" на строке с "\(" и "\)"?

Ничто, кажется, не работает:

"foo ( bar ) foo".gsub("(", "\(") # => "foo ( bar ) foo"

"foo ( bar ) foo".gsub("(", "\\(") # => "foo \\( bar ) foo"

Какая-либо идея?

6
задан Chuck 6 May 2010 в 18:16
поделиться

3 ответа

Вы уже нашли решение со второй попытки, вы просто запутались, потому что в интерактивном интерпретаторе строка отображается в экранированном виде. Но на самом деле там только одна обратная косая черта, а не две. Попробуйте напечатать ее с помощью 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.

4
ответ дан 10 December 2019 в 02:43
поделиться

В строке, созданной с использованием двойных кавычек, \ экранирует следующий символ. Итак, чтобы получить обратную косую черту в строке, вам нужно избежать самой обратной косой черты: "\\ (" . Или вы можете просто использовать строку в одинарных кавычках, которая требует меньше предварительной обработки: '\ (' .

1
ответ дан 10 December 2019 в 02:43
поделиться

"foo ( bar ) foo".gsub("(", "\\\\(") действительно работает. Если вы пробуете это в консоли, вы, вероятно, видите \\\( строку, потому что консоль выводит строку с inspect, который экранирует \

Попробуйте с: puts "foo ( bar ) foo".gsub("(", "\\\(") и вы увидите

1
ответ дан 10 December 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: