Подтвердить что ты не робот

Экранирование строки в Ruby

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

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

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

4b9b3361

Ответ 1

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

Сбегите #, обратную косую черту и двойную кавычку.

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

Во-вторых, я бы подумал, что это будет heredoc:

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

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

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

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

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