تعبير عادي يطابق الملف الأول فقط في مجموعة ملفات RAR

StackOverflow https://stackoverflow.com/questions/109916

  •  02-07-2019
  •  | 
  •  

سؤال

لمعرفة الملف الذي سيتم استدعاء أمر unrar عليه، يحتاج المرء إلى تحديد الملف الذي هو الأول في مجموعة الملفات.

فيما يلي بعض نماذج أسماء الملفات، والتي - بطبيعة الحال - يجب مطابقة المجموعة الأولى فقط:

yes.rar
yes.part1.rar
yes.part01.rar
yes.part001.rar

no.part2.rar
no.part02.rar
no.part002.rar
no.part011.rar

إحدى الطرق (المحدودة) للقيام بذلك باستخدام التعبيرات المنطقية المتوافقة مع PCRE هي:

.*(?:(?<!part\d\d\d|part\d\d|\d)\.rar|\.part0*1\.rar)

لم ينجح هذا في روبي عندما اختبرته في ريجاكس لكن.

كيف تكتب واحدة روبي متوافق هل يتطابق التعبير العادي مع الملف الأول فقط في مجموعة ملفات RAR؟

هل كانت مفيدة؟

المحلول

الإجابة المختصرة هي أنه ليس من الممكن إنشاء تعبير عادي واحد لتلبية مشكلتك.لا يحتوي الإصدار Ruby 1.8 على تأكيدات البحث (؟<!الأشياء الموجودة في مثال التعبير العادي الخاص بك) وهذا هو سبب عدم عمل التعبير العادي الخاص بك.هذا يترك لك خيارين.

1) استخدم أكثر من تعبير عادي للقيام بذلك.

def is_first_rar(filename)
    if ((filename =~ /part(\d+)\.rar$/) == nil)
        return (filename =~ /\.rar$/) != nil
    else
        return $1.to_i == 1
    end
end

2) استخدم محرك regex لـ Ruby 1.9، أونيجوروما.وهو يدعم تأكيدات البحث، ويمكنك ذلك قم بتثبيته كجوهرة لـ Ruby 1.8.بعد ذلك، يمكنك القيام بشيء مثل هذا:

def is_first_rar(filename)
    reg = Oniguruma::ORegexp.new('.*(?:(?<!part\d\d\d|part\d\d|\d)\.rar|\.part0*1\.rar)')
    match = reg.match(filename)
    return match != nil
end

نصائح أخرى

لا تعتمد على أسماء الملفات لتحديد أي منها أولاً.سينتهي بك الأمر إلى العثور على حالة حافة حيث تحصل على الملف الخطأ.

رؤوس RAR سيخبرك بالملف الذي هو الأول في المجلد، على افتراض أنه تم إنشاؤه في إصدار حديث إلى حد ما من RAR.

إشارات البت HEAD_FLAGS:
2 بايت

0x0100 - المجلد الأول (تم تعيينه فقط بواسطة RAR 3.0 والإصدارات الأحدث)

لذا افتح كل ملف وافحص رؤوس RAR، وابحث تحديدًا عن العلامة التي تشير إلى الملف الذي يمثل المجلد الأول.لن يفشل هذا أبدًا، طالما أن الأرشيف ليس تالفًا.لقد أجريت اختباراتي الخاصة مع أرشيفات RAR الممتدة ورؤوسها صحيحة وفقًا للرابط أعلاه.

هذه طريقة أكثر أمانًا لتحديد الملف الأول في مجموعة مثل هذه.

أنا شخصياً لن أستخدم التعبيرات العادية (الموسعة) في هذه الحالة (أو على الأقل لن أستخدم تعبيرًا واحدًا فقط للقيام بكل ذلك).ما الخطأ في ترميز هذا، على سبيل المثال، في عدد قليل ifس؟

أنا لست خبيرًا في التعبير العادي ولكن هذه هي محاولتي

^(yes|no)\.(rar|part0*1\.rar)$

استبدل "yes|no" باسم الملف الفعلي.لقد قمت بمطابقتها مع الأمثلة الخاصة بك لمعرفة ما إذا كانت ستتطابق فقط مع المجموعة الأولى ومن ثم "نعم | لا" في التعبير العادي.

تحديث:ثابت حسب التعليق.لست متأكدًا من سبب عدم معرفة المستخدم اسم الملف لذلك لم أصلح هذا الجزء ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top