Вопрос

У меня есть куча строки со специальными кодами Escape, которые я хочу хранить безрассудно, например, показывает интерпретатор

"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\011zero@\\016"но я хочу, чтобы это показать (при осмотре) как"\014\"\000\"\016smoothing\"\011mean\"\022color\"\011zero@\016"

Какой метод их не нужно? Я представляю, что я мог бы сделать регез, чтобы удалить 1 обратную косание с каждые подряд n обратной ячейки, но у меня нет большого опыта Regex, и кажется, что есть «более элегантный» способ сделать это.

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

Спасибо!

Отредактировано, чтобы добавить контекст: у меня есть этот класс, который используется для маршала / восстановления некоторых вещей, но когда я восстанавливаю некоторые старые струны, он выплескивает ошибку типа, которая я определена, потому что они не были - для некоторой необъяснимой причины - хранится как Base64. Вместо этого они, кажется, только что были сбежены, которые я не хочу, потому что пытаясь восстановить их аналогично дает ДжерроруTypeError: incompatible marshal file format (can't be read) format version 4.8 required; 92.48 givenПотому что маршал смотрит на первые символы строки, чтобы определить формат.

require 'base64'
class MarshaledStuff < ActiveRecord::Base

  validates_presence_of :marshaled_obj

  def contents
    obj = self.marshaled_obj
    return Marshal.restore(Base64.decode64(obj))
  end

  def contents=(newcontents)
    self.marshaled_obj = Base64.encode64(Marshal.dump(newcontents))
  end
end

Редактировать 2: Измененная формулировка - я думал, что они «сбежали», но это было только односпалочно. Упс!

Это было полезно?

Решение

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

> x
=> "\\"
> puts x
\
=> nil
> x.length
=> 1

Обратите внимание, что, хотя он выглядит как X содержит две обратные язвы, длина строки - одна. Дополнительная вершина добавляется интерпретатором и не совсем частью строки.

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


Редактировать: В своем примере единственное, что нужно UneCaping, - это восьмеричные коды Escape. Вы можете попробовать это:

x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top