Избегать одинарных и двойных кавычек в строке в рубине? - PullRequest
65 голосов
/ 15 июля 2011

Как я могу избежать одинарных и двойных кавычек в строке?

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

Например: str = "ruby 'on rails" " = ruby 'on rails"

Ответы [ 9 ]

77 голосов
/ 15 июля 2011

Мой предпочтительный способ - не беспокоиться о экранировании и вместо этого использовать %q, который ведет себя как строка в одинарных кавычках (без интерполяции или экранирования символов), или %Q для поведения строки в двойных кавычках:

str = %q[ruby 'on rails" ] # like single-quoting
str2 = %Q[quoting with #{str}] # like double-quoting: will insert variable

См. https://docs.ruby -lang.org / ru / trunk / syntax / literals_rdoc.html # label-Strings и поиск % strings.

28 голосов
/ 18 марта 2013

Используйте обратную косую черту для экранирования символов

str = "ruby \'on rails\" "
19 голосов
/ 03 августа 2015

Вот полный список:

enter image description here

С http://learnrubythehardway.org/book/ex10.html

19 голосов
/ 15 июля 2011

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

str = %Q|ruby 'on rails" " = ruby 'on rails|
7 голосов
/ 24 июля 2014

Я бы пошел с heredoc , если мне придется беспокоиться о побеге.Он позаботится об этом за вас:

string = <<MARKER 
I don't have to "worry" about escaping!!'"!!
MARKER

MARKER обозначает начало / конец строки.начинайте строку на следующей строке после открытия heredoc, затем заканчивайте строку, снова используя делинатор на своей собственной строке.

Это делает все необходимое экранирование и преобразуется в строку в двойных кавычках:

string
=> "I don't have to \"worry\" about escaping!!'\"!!\n"
7 голосов
/ 15 июля 2011
>> str = "ruby 'on rails\" \" = ruby 'on rails"
=> "ruby 'on rails" " = ruby 'on rails"
5 голосов
/ 15 сентября 2016

Я бы использовал просто: str = %(ruby 'on rails ") Поскольку просто % обозначает двойные кавычки (или% Q) и допускает интерполяцию переменных в строке.

1 голос
/ 07 июня 2017

Одна оговорка:

Использование %Q[] и %q[] для сравнения строк не является интуитивно безопасным.

Например, если вы загружаете что-то, предназначенное для обозначения чего-то пустого, например "" или '', вам необходимо использовать фактические escape-последовательности. Например, скажем, qvar равно "" вместо любой пустой строки.

Это даст оценку false
if qvar == "%Q[]"

Как это будет,
if qvar == %Q[]

Пока это будет оцениваться до true
if qvar == "\"\""

Я столкнулся с этой проблемой, когда отправлял переменные командной строки из другого стека в мой скрипт ruby. Только ответ Габриэля Аугусто работал на меня.

0 голосов
/ 13 мая 2014

Вот пример того, как использовать %Q[] в более сложном сценарии:

  %Q[
    <meta property="og:title" content="#{@title}" />
    <meta property="og:description" content="#{@fullname}'s profile. #{@fullname}'s location, ranking, outcomes, and more." />
  ].html_safe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...