gsub избежал двойной кавычки к экранированной одинарной кавычке в строке - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть следующая строка ввода:

string = "\"Newegg.com\" <Promo@email.newegg.com>"

Я хочу заменить \" на \'.Я попробовал это:

string.gsub(/\"/) {|i| "\\'" }
# => "\\'Newegg.com\\' <Promo@email.newegg.com>"

string.gsub(/\"/,%q(\\\'))
# => "\\'Newegg.com\\' <Promo@email.newegg.com>"

В обоих случаях у него есть два экземпляра \, но я хочу только один.Кажется, проблема с обратной косой чертой и выходом из б / с, это работает иначе:

string.gsub(/\"/,%q('))
# => "'Newegg.com' <Promo@email.newegg.com>"

- Обновление 1 - да, при вводе действительно отображается «правильное» значение

temp = string.gsub(/\"/,%q(\\\'))
# => "\\'Newegg.com\\' <Promo@email.newegg.com>"
puts temp
# >> \'Newegg.com\' <Promo@email.newegg.com>

но я хочу сохранить это точное значение, отображаемое в последней строке.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Похоже, вы немного смущены (понятно, что так) возвращенным результатом.Имейте в виду, что в irb последний результат форматируется с использованием .inspect, что означает, что он оборачивает строки в двойные кавычки, а затем экранирует символы (обратные слэши и двойные кавычки) ', которые необходимо экранировать в строке в двойных кавычках.Это делается для того, чтобы различать строки и другие значения, такие как числа, массивы, хэши и т. Д.

Однако это только результат проверки.если вы используете put для вывода значения, оно будет выводиться без экранирования - это более точное представление вашего значения. Значение, отображаемое put, является реальным значением, и что будет сохранено, если вы сохраните значение в переменной.

Если вы все еще не можете сказать, как выглядит ваша строка, попробуйте следующее:

temp = string.gsub(/\"/,%q(\\\'))

temp.split('')
=> ["\\", "'", "N", "e", "w", "e", "g", "g", ".", "c", "o", "m", "\\", "'", " ", "<", "P", "r", "o", "m", "o", "@", "e", "m", "a", "i", "l", ".", "n", "e", "w", "e", "g", "g", ".", "c", "o", "m", ">"]

Это разбивает вашу строку на массив из отдельных символов и может упростить ее просмотр.именно то, что в вашей строке.Обратите внимание, что у вас есть символ \ (отображается как "\\", но поскольку каждая строка гарантированно будет иметь длину ровно один символ, вы знаете, что она отображается таким образом из-за проверки) и символ ' в начале.

0 голосов
/ 20 декабря 2018

Ваша фактическая строка не включает \

puts "\"Newegg.com\" <Promo@email.newegg.com>"
> "Newegg.com" <Promo@email.newegg.com>

Это заменит " на ', как вы хотели:

puts "\"Newegg.com\" <Promo@email.newegg.com>".gsub('"', "'")
> 'Newegg.com' <Promo@email.newegg.com>

Если вы действительно хотели \", попробуйте другой escape-символ, например:

puts "\\\"Newegg.com\\\" <Promo@email.newegg.com>"
> \"Newegg.com\" <Promo@email.newegg.com>

То же самое замещение должно работать:

puts "\\\"Newegg.com\\\" <Promo@email.newegg.com>".gsub('"', "'")
> \'Newegg.com\' <Promo@email.newegg.com>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...