Ruby - ищет какой-то метод "Regexp unescape" - PullRequest
2 голосов
/ 08 апреля 2010

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

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

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

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

Спасибо!

Отредактировано для добавления контекста: у меня есть этот класс, который используется для маршалирования / восстановления некоторых вещей, но когда я восстанавливаю некоторые старые строки, он выдает ошибку типа, которую я определил, потому что они не были - для какая-то необъяснимая причина - сохраняется как base64. Вместо этого они, кажется, только что сбежали, чего я не хочу, потому что попытка восстановить их аналогично дает TypeError 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: Измененная формулировка - я думал, что они были "двойными, но только одними. Упс!

1 Ответ

1 голос
/ 08 апреля 2010

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

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

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

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


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

x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }
...