روبي - تبحث عن نوع من طريقة "regexp unescape"
سؤال
لدي مجموعة من السلسلة مع رموز الهروب الخاصة التي أرغب في تخزينها دون تكييف ، على سبيل المثال ، يظهر المترجم المترجم
"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\011zero@\\016"
لكني أريد أن تظهر (عند التفتيش) كما"\014\"\000\"\016smoothing\"\011mean\"\022color\"\011zero@\016"
ما هي طريقة إلغاء التعبير عنهم؟ أتصور أنه يمكنني صنع regex لإزالة واحدة من التراجع الخلفي من كل لقطات متتالية ، لكن ليس لدي الكثير من تجربة regex ويبدو أنه يجب أن تكون هناك طريقة "أكثر أناقة" للقيام بذلك.
على سبيل المثال ، عندما أنا puts MyString
يعرض الإخراج الذي أحبه ، لكنني لا أعرف كيف يمكنني التقاط ذلك إلى متغير.
شكرًا!
تم تحريره لإضافة سياق: لدي هذا الفئة التي يتم استخدامها في حشد / استعادة بعض الأشياء ، ولكن عندما أسترجع بعض الأوتار القديمة ، فإنه يبصق على خطأ في النوع الذي حددته هو أنها لم تكن كذلك - لسبب ما لا يمكن تفسيره - مخزنة كما base64. وبدلاً من ذلك يبدو أنهم قد هربوا للتو ، وهو ما لا أريده ، لأن محاولة استعادتها بمثابة تعطي نوع typeerrorTypeError: 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 يحتوي على اثنين من الانزلاق الخلفي ، فإن طول السلسلة هو واحد. يضاف المترجم المترجم الإضافي عن طريق المترجم وليست جزءًا من السلسلة.
إذا كنت لا تزال تعتقد أن هناك مشكلة ، فيرجى أن تكون أكثر تحديدًا حول كيفية عرض الأوتار التي ذكرتها في سؤالك.
تحرير: في المثال الخاص بك ، الشيء الوحيد الذي يحتاج إلى التخلص من رموز الهروب الثمانية. يمكنك تجربة هذا:
x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }