Рубин / & в строке

Мне нужно включить / & в строку ZPL, чтобы разбить длинную строку на этикетке.

Существует сообщение stackoverflow, который предлагает множество методов, но, похоже, не отвечает на мой вопрос:

Вот моя проблема:

>>"asdf & asdf".gsub("&", "\\\\&")
=>"asdf \\& asdf"

Да, если я вставлю строку, она вернет то, что я хочу:

>>puts "asdf & asdf".gsub("&", "\\\\&")
=>asdf \& asdf

Но мне нужно, чтобы фактическая строка равнялась asdf \& asdf

Я пробовал проверить:

>>"asdf & asdf".gsub("&", "\\\\&").inspect
=>"\"asdf \\\\& asdf\""

>>"asdf & asdf".gsub("&", "\&").inspect
=>"\"asdf & asdf\""

Но это также не возвращает то, что мне нужно. Может быть, мне не хватает какой-то комбинации, которая вернет \ & в строке?

Спасибо

Попробуйте это: str = "asdf \\& asdf"; str.chars #=> ["a", "s", "d", "f", " ", "\\", "&", " ", "a", "s", "d", "f"]; str.size #=> 12; str.each_char.map(&:ord) #=> [97, 115, 100, 102, 32, 92, 38, 32, 97, 115, 100, 102]. Мы видим, что "\\".ord #=> 92. При просмотре любого Таблица ASCII мы видим, что символ со значением ASCII 92 является обратной косой чертой. Если бы мы написали "\".size, Ruby терпеливо ждал бы закрывающих двойных кавычек. Пока что строка содержит единственный символ, экранированную двойную кавычку, которая является просто двойной кавычкой.

Cary Swoveland 26.10.2018 00:25

Кажется, что OP путается между внутренней строкой и тем, что выводится на терминал, который вы видите (или слышите, если вы используете аудиальный терминал). Комментарий @CarySwoveland хорош. Краткая форма - "asdf \\& asdf".codepoints

Masa Sakano 26.10.2018 09:34

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

Cary Swoveland 26.10.2018 10:59
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
3
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы видите, что Ruby показывает что-то вроде:

"asdf \\& asdf"

Он разбит на токены \\ (обратная косая черта) и & (амперсанд), где первая обратная косая черта является особой, а вторая - фактическим символом. Вы можете прочитать это как «обратная косая черта буквальный».

При печати вы видите настоящую строку. Это правильно.

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

Это сделано для того, чтобы \n и \r и другие управляющие символы работали, но вы также можете использовать обратную косую черту. Есть большая разница между \n (новая строка) и \\n (буквальный обратная косая черта, буква n).

Вы часто будете видеть это при работе с форматами данных, содержащими специальные символы. Например, в форматерах стиля printf значение % имеет значение, поэтому для печати настоящего % вам необходимо его удвоить:

'%.1f%%' % 10.3
#=> "10.3%"

У каждого формата есть свои особенности и проблемы. HTML не рассматривает обратную косую черту как особую, но он обрабатывает <, > и &, поэтому вы увидите &amp; вместо амперсанда.

Хороший ответ. Другими словами, "\\" представляет собой одну обратную косую черту, хотя вы видите две. Точно так же, как "\n" представляет собой новую строку, хотя вы не видите символ новой строки.

3limin4t0r 25.10.2018 22:23

Другие вопросы по теме