2010-04-08 2 views
2

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

"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\[email protected]\\016" , но я хочу, чтобы показать (при проверке) в качестве "\014\"\000\"\016smoothing\"\011mean\"\022color\"\[email protected]\016"

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

Например, когда I 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 

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

ответ

1

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

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

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

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


Редактировать: В вашем примере единственное, что требуется для отмены, - это восьмеричные коды эвакуации. Вы можете попробовать следующее:

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

Хех, глядя на не сломанную строку, вы правы, что они только сбежали, но я не хочу, чтобы они бежали вообще! – RubyNoobie

+0

@RubyNoobie: интерпретатор никогда не покажет ваш второй пример, потому что это не допустимая строка. Даже строка длиной одна с только одной цитатой будет отображаться как '' \ "" в интерпретаторе. Я думаю, ваша проблема кроется в другом месте. –

+0

'Нет'? Или' nil'? – yfeldblum

Смежные вопросы