экранирование строки в Ruby - PullRequest
12 голосов
/ 28 октября 2009

Я хочу вставить следующее в качестве значения для переменной в некотором Ruby:

`~!@#$%^&*()_-+={}|[]\:";'<>?,./

Окружение этого в двойных кавычках не работает, так есть ли хороший способ побега?

Ответы [ 4 ]

13 голосов
/ 28 октября 2009

Не используйте несколько методов - будьте проще.

Escape #, обратный слеш и двойные кавычки.

irb(main):001:0> foo = "`~!@\#$%^&*()_-+={}|[]\\:\";'<>?,./"
=> "`~!@\#$%^&*()_-+={}|[]\\:\";'<>?,./"

Или, если вы не хотите экранировать # (символ подстановки для переменных в строках, заключенных в двойные кавычки), вместо этого используйте и экранируйте одинарные кавычки:

irb(main):002:0> foo = '`~!@#$%^&*()_-+={}|[]\\:";\'<>?,./'
=> "`~!@\#$%^&*()_-+={}|[]\\:\";'<>?,./"

% q отлично подходит для множества других строк, которые не содержат каждый знак пунктуации ascii. :)

%q(text without parens)
%q{text without braces}
%Q[text without brackets with #{foo} substitution]

Редактировать: Очевидно, вы также можете успешно использовать сбалансированные парены внутри% q (), но я думаю, что это немного опасно с точки зрения обслуживания, так как там нет семантики, которая подразумевала бы, что вы всегда будете обязательно балансировать свои парены в строке.

8 голосов
/ 28 октября 2009

Во-первых, если я не сумасшедший %q() работает здесь, прекрасно, поскольку внутренние скобки сбалансированы:

>> weird = %q(`~!@#$%^&*()_-+={}|[]\:";'<>?,./)
=> "`~!@\#$%^&*()_-+={}|[]\\:";'<>?,./"
>> puts weird
`~!@#$%^&*()_-+={}|[]\:";'<>?,./

В качестве примечания: при использовании %q у вас всегда есть ядерная опция использования пробелов в качестве разделителя. Это фол и официально плохая идея, но она работает.

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

>> weird = %q `~!@#$%^&*()_-+={}|[]\:";'<>?,./ 
=> "`~!@\#$%^&*()_-+={}|[]\\:";'<>?,./"
2 голосов
/ 28 октября 2009

<<EOT и %q{} ваши друзья. Информация об их использовании из Programming Ruby Прагматическое руководство для программистов .

Попробуйте смешать различные подходы:

%q{`~!@#$%^&*()_-+}+"{}"+%q{=|[]\\:";'<>?,./}

или, альтернативно, просто используйте обратную косую черту, чтобы избежать проблемных символов:

"`~!@\#$%^&*()_-+{}=|[]\\:\";'<>?,./"
0 голосов
/ 28 октября 2009

Первое, о чем я обычно думаю, это директива % q - но, поскольку вы, кажется, используете все знаки препинания, которые вы обычно используете, чтобы разделить их, я не могу думать простого способа заставить его работать здесь.

Второе, о чем я подумаю, это наследственность:

mystring = <<END
`~!@#$%^&*()_-+={}|[]\:";'<>?,./
END

Это ломается после обратной косой черты.

Итак, мой третий ответ, неуклюжий, но лучшее, что я могу придумать, подумав всего две минуты, - это заменить что-то безобидное для «проблемных» символов, а затем заменить его после задания:

mystring = '`~!@#$%^&*()_-+={}|[]\:"; <>?,./'.tr(" ","'")

Мне это не нравится, но это работает.

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