Ruby - Escape Parenthesis - PullRequest
       3

Ruby - Escape Parenthesis

6 голосов
/ 06 мая 2010

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

Как заменить все вхождения "(" и ")" в строке на "\(" и "\)"?

Ничего не работает:

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

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

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 06 мая 2010

У вас уже есть решение со второй попытки, вы просто запутались, потому что строка отображается в экранированном виде в интерактивном интерпретаторе. Но на самом деле есть только один обратный слеш, а не два. Попробуйте распечатать его, используя Put, и вы увидите, что на самом деле есть только одна обратная косая черта:

> "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.

3 голосов
/ 07 октября 2011

Вот то, что я только что использовал для замены обоих паренов в одном вызове:

str.gsub(/(\(|\))/,'\\\\\1')
1 голос
/ 06 мая 2010

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

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

1 голос
/ 06 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...