مطابقة الأحرف البديلة

في علوم الحاسوب ، تُعدّ خوارزمية مطابقة الأحرف البديلة (المعروفة أيضًا باسم مطابقة الأحرف البديلة ) مفيدةً في مقارنة سلاسل النصوص التي قد تحتوي على صيغة أحرف بديلة . [ 1 ] تشمل الاستخدامات الشائعة لهذه الخوارزميات واجهات سطر الأوامر ، مثل Bourne shell [ 2 ] أو سطر أوامر Microsoft Windows [ 3 ] أو محرر النصوص أو مدير الملفات، بالإضافة إلى واجهات بعض محركات البحث [ 4 ] وقواعد البيانات. [ 5 ] تُعدّ مطابقة الأحرف البديلة جزءًا من مشكلة مطابقة التعابير النمطية ومطابقة السلاسل النصية بشكل عام. [ 6 ]

المشكلة

يقوم مُطابق الأحرف البديلة باختبار نمط الأحرف البديلة p مقابل سلسلة الإدخال s . ويُجري مطابقة مُثبتة ، ويعيد القيمة "صحيح" فقط عندما يُطابق p سلسلة s بالكامل .

يمكن أن يستند النمط إلى أي صيغة شائعة (انظر globbing )، ولكن في نظام التشغيل Windows يميل المبرمجون إلى مناقشة صيغة مبسطة فقط يدعمها وقت تشغيل C الأصلي: [ 7 ] [ 8 ]

  • لم يتم تعريف أي أحرف هروب
  • الأحرف البديلة: ?تطابق ظهورًا واحدًا فقط لأي حرف. *تطابق عددًا غير محدود من الظهورات (بما في ذلك الصفر) لأي حرف.

تتناول هذه المقالة بشكل أساسي صياغة المشكلة في نظام ويندوز، ما لم يُذكر خلاف ذلك.

تعريف

يمكن تعريف مشكلة مطابقة الأحرف البديلة، باستخدام الفهارس التي تبدأ من الصفر، بشكل تكراري على النحو التالي:

م٠٠=(ص0=ت0)م0ج=خطأ شنيعمأنا0=(صأنا-1='*')مأنا-1،0مأناج={مأنا-1،ج-1لصأنا-1=تج-1صأنا-1='؟'مأنا،ج-1مأنا-1،جلصأنا-1='*'خطأ شنيعلصأنا-1تج-1ل1أنا|ص|،1ج|ت|.\begin{aligned}m_{00}&=(p_{0}=t_{0})\\m_{0j}&={\text{false}}\\m_{i0}&=(p_{i-1}={\text{'*'}})\land m_{i-1,0}\\m_{ij}&=\begin{cases}m_{i-1,j-1}&{\text{لـ}}\;p_{i-1}=t_{j-1}\lor p_{i-1}={\text{'?'}}\\m_{i,j-1}\lor m_{i-1,j}&{\text{لـ}}\;p_{i-1}={\text{'*'}}\\{\text{false}}&{\text{لـ}}\;p_{i-1}\neq t_{j-1}\end{cases}}&&\quad {\text{for}}\;1\leq i\leq |p|,1\leq j\leq |t|.\end{aligned}}}

حيث يمثل m<sub> ij</sub> نتيجة مطابقة النمط p مع النص t بعد اقتطاعه عند الحرفين i و j على التوالي. هذه هي الصيغة المستخدمة في خوارزمية ريختر وخوارزمية Snippets الموجودة في مجموعة كانتاتوري. [ 9 ] [ 10 ] هذا الوصف مشابه لمسافة ليفنشتاين .

تشمل المشكلات ذات الصلة المباشرة في علوم الحاسوب ما يلي:

  • مطابقة الأنماط مع تجاهل القيم غير المهمة أو الفجوات، بحث عن سلسلة نصية غير مثبتة مع ما يعادل القيمة ?المحددة فقط. [ 11 ] [ 12 ]
  • مطابقة الأنماط باستخدام الأحرف البديلة، وهي عملية بحث عن سلسلة نصية غير مُثبَّتة مع ما يُعادل كلا الحرفين البديلين المُعرَّفين. يستغرق وقت تشغيلها وقتًا أُسِّيًّا ما لم يتم تحديد حد أقصى للطول في صيغة مطابقة الأنماط باستخدام الأحرف البديلة المرنة. [ 13 ]

تاريخ

اعتمدت الخوارزميات المبكرة لمطابقة الأحرف البديلة غالبًا على الاستدعاء الذاتي ، لكن هذه التقنية وُجهت إليها انتقاداتٌ تتعلق بالأداء [ 10 ] والموثوقية [ 8 ] . وقد حظيت الخوارزميات غير الاستدعائية لمطابقة الأحرف البديلة بشعبيةٍ متزايدة في ضوء هذه الاعتبارات.

تتباين استراتيجيات تنفيذ عملية مطابقة الأنماط بشكل كبير بين الخوارزميات التكرارية وغير التكرارية، كما يتضح من تنوع الخوارزميات المذكورة أدناه. وقد تم تطبيق تقنيات تطوير حالات الاختبار وتحسين الأداء بشكل واضح على بعض الخوارزميات، لا سيما تلك التي طورها منتقدو الخوارزميات التكرارية.

الخوارزميات المتكررة

يحدث التكرار عادةً عند المطابقة *عندما يكون هناك المزيد من اللواحق للمطابقة. وهذا شكل من أشكال التراجع ، والذي تقوم به أيضًا بعض أدوات مطابقة التعبيرات النمطية.

تتشابه هذه الخوارزميات في شكلها العام. عند استخدام التكرار، تُقسّم الخوارزمية المدخلات إلى سلاسل فرعية، وتعتبر التطابق قائمًا عندما تُعيد إحدى هذه السلاسل الفرعية تطابقًا إيجابيًا. بالنسبة لـ dowild("*X", "abcX")، ستستدعي الخوارزمية بشكل جشع الدوال dowild("X", "abcX")، و dowild("X", "bcX")، dowild("X", "cX")و dowild("X", "X"). عادةً ما تختلف هذه الخوارزميات في أمور أقل أهمية، مثل دعم الميزات، وفي عوامل أكثر أهمية، مثل التحسينات الطفيفة ولكن الفعّالة للغاية. من بين هذه التحسينات:

  • إشارة الإيقاف (ABORT) للحماية من التكرار المفرط (لارس ماثيسن، 1991). على الرغم من صحة التكرار البسيط على جميع السلاسل المتبقية (النمط والنص) *والتأكد من أن إحدى السلاسل الفرعية تُرجع تطابقًا إيجابيًا، إلا أن وقت التشغيل يصبح أُسّيًا عند رفض تطابق مع وجود العديد من التطابقات *في النص. قام لارس ماثيسن بتغيير الإرجاع إلى ثلاث فئات: تطابق، عدم تطابق، وإيقاف (ABORT) (لا يوجد تطابق ممكن على الإطلاق للتكرار باستخدام علامة النجمة). تُرجع قيمة الإيقاف (ABORT) عندما يُستهلك النص مبكرًا جدًا أو عندما يفشل تطابق آخر باستخدام علامة النجمة، مما يضمن أداءً خطيًا بالنسبة لعدد علامات النجمة. (يُضاف إلى ذلك أن التعقيد الإجمالي تربيعي لعدد الأحرف المتبقية للمطابقة). [ 14 ] كما يغطي إيقاف المطابقة الفارغة (wildmatch) في Git/Rsync المدخلات غير الصالحة. [ 21 ] ويفعل INN uwildmat الجديد الشيء نفسه. [ 22 ]
  • تحسين استخدام علامة النجمة في الاستدعاء الذاتي. يُعدّ هذا التعديل على المطابقة البديلة طفيفًا نسبيًا. وينطبق عندما يرغب الاستدعاء الذاتي في مطابقة "*X" مع "abcX": فعندما تتبع علامة النجمة قيمة حرفية مثل "X"، من الواضح أن المقارنة الأخيرة فقط ذات الأطوال المتساوية هي التي ستُنتج تطابقًا. [ 21 ] وقد لوحظ هذا سابقًا في uwildmat عام 2000 [ 22 ] وبشكل ضمني في دالة fnmatch الخاصة بفان روسوم FNM_PATHNAME.

تُعدّ خوارزمية مارتن ريختر استثناءً لهذه القاعدة، على الرغم من أن العملية برمتها مكافئة. عند استخدام *، تستدعي الخوارزمية دالة تكرارية لزيادة أيٍّ من المؤشرين، وفقًا لصياغة البرمجة الديناميكية للمسألة. كما يُمكن تطبيق تقنية "الإجهاض" عليها أيضًا. [ 9 ] في الأنماط النموذجية (كما اختبرها كانتاتوري)، تكون أبطأ من تطبيقات الاستدعاء الجشع. [ 10 ]

تُعدّ الخوارزميات التكرارية أسهل في الفهم عمومًا، ومع تعديل ABORT، يكون أداؤها مقبولًا من حيث تعقيد أسوأ الحالات . أما بالنسبة للسلاسل النصية التي لا تحتوي على علامة *، فإنها تستغرق وقتًا خطيًا يتناسب مع حجم السلسلة النصية للمطابقة نظرًا لوجود علاقة ثابتة بين عنصرين.

الخوارزميات غير المتكررة

تم تطوير ما يلي من قبل منتقدي الخوارزميات التكرارية:

ما يلي ليس كذلك:

  • خوارزمية جاك هاندي غير الصحيحة [ 25 ] (تفشل MATCH("*?", "xx"))

تُنفّذ الدوال التكرارية المذكورة أعلاه عملية التراجع عن طريق حفظ مجموعة قديمة من مؤشرات النمط/النص، والعودة إليها في حال فشل التطابق. ووفقًا لكورت، بما أنه لا يلزم سوى تطابق واحد ناجح، فلا حاجة إلا لحفظ مجموعة واحدة من هذه المجموعات. [ 17 ]

بالإضافة إلى ذلك، يمكن تحويل مشكلة مطابقة الأحرف البديلة إلى مطابقة التعبيرات النمطية باستخدام أسلوب استبدال نصي بسيط . على الرغم من أن مُطابقات التعبيرات النمطية غير التكرارية، مثل بنية طومسون، أقل استخدامًا عمليًا بسبب افتقارها لدعم المراجع الخلفية، فإن مطابقة الأحرف البديلة عمومًا لا تتمتع بمجموعة ميزات غنية مماثلة. (في الواقع، العديد من الخوارزميات المذكورة أعلاه تدعم فقط الأحرف البديلة ?واللاحقة *). يمكن تعديل تطبيق روس كوكس لخوارزمية طومسون NFA بسهولة لهذا الغرض. [ 26 ] توفر خوارزمية nrgrep القائمة على BDM لغوستافو نافارو تطبيقًا أكثر تبسيطًا مع التركيز على اللواحق الفعالة. [ 27 ] انظر أيضًا قسم تطبيقات التعبيرات النمطية  .

انظر أيضاً

مراجع

  1. "الأحرف البديلة" . ساينس دايركت . 2018. مؤرشف من الأصل في 27 مايو 2018. تم الاطلاع عليه في 9 مايو 2018 .
  2. كويجلي، إيلي (2005). دليل البدء السريع لبرمجة يونكس شل . InformIT.com.
  3. "أحرف البدل في نظامي MS-DOS وويندوز" . مكتبة شبكة مطوري مايكروسوفت . 31 مايو 2018.
  4. "أباتشي لوسين - بناء جملة محلل الاستعلامات" . وثائق أباتشي لوسين 2.9.4. 2006.
  5. "أحرف البدل في SQL" . W3Schools . 2018.
  6. غويفيرتس، جان (2018). "مرحباً بكم في Regular-Expressions.info" . RegularExpressions.info.
  7. "توسيع الأحرف البديلة" . docs.microsoft.com . 8 فبراير 2022.
  8. 1 2 3 كراوس، كيرك (2008). "مطابقة الأحرف البديلة: خوارزمية" . مجلة دكتور دوبز .
  9. 1 2 3 Deadlock (2015). "خوارزمية المطابقة التكرارية باستخدام الأحرف البديلة في لغة C++" . Stack Overflow .
  10. 1 2 3 4 كانتاتوري، أليساندرو (2003). "خوارزميات مطابقة الأحرف البديلة" .
  11. إيليوبولوس، كوستاس س.؛ رحمن، م. سهيل (2007). "خوارزميات مطابقة الأنماط مع حالات عدم الاكتراث" (ملف PDF) . مؤتمر SOFSEM 2007: نظرية وممارسة علوم الحاسوب، المؤتمر الثالث والثلاثون حول الاتجاهات الحالية في نظرية وممارسة علوم الحاسوب . هاراشوف، جمهورية التشيك. S2CID 14538871. مؤرشف من الأصل (ملف PDF) بتاريخ 17 ديسمبر 2019. 
  12. كليفورد، بيتر؛ كليفورد، رافائيل (يناير 2007). "مطابقة الأحرف البديلة الحتمية البسيطة". رسائل معالجة المعلومات . 101 (2): 53-54 . doi : 10.1016/j.ipl.2006.08.002 .
  13. وو، شيندونغ؛ تشيانغ، جي-بنغ؛ شي، فاي (12 سبتمبر 2014). "مطابقة الأنماط باستخدام الأحرف البديلة المرنة". مجلة علوم وتكنولوجيا الحاسوب . 29 (5): 740-750 . doi : 10.1007/s11390-014-1464-3 . S2CID 16824910 . 
  14. 1 2 سالز، ريتش (1991). "wildmat.c" . جيثب .
  15. فيليب (2014). "مقارنة السلاسل النصية باستخدام الأحرف البديلة" . ستاك أوفرفلو .
  16. موروجيسان، فيجنيش (2014). "خوارزمية مطابقة الأحرف البديلة" .
  17. 1 2 3 كورت، دوجان. "طرق مطابقة الأحرف البديلة" .
  18. فان روسوم، غيدو (20 نوفمبر 2019). "freebsd/lib/libc/gen/fnmatch.c" . جيت هاب . تم الاطلاع عليه في 21 نوفمبر 2019 .
  19. "fnmatch.c" . opensource.apple.com. 1999.
  20. "fnmatch_internal.c" . مرايا بيرين مينور. 21 نوفمبر 2019.
  21. 1 2 "git/git: wildmatch.c" . GitHub . 2020-01-20.
  22. 1 2 "uwildmat.c في trunk/lib – INN" . inn.eyrie.org . تم الاطلاع عليه بتاريخ 27 نوفمبر 2019 .
  23. كراوس، كيرك (2018). "مطابقة الأحرف البديلة: خوارزمية محسّنة للبيانات الضخمة" . التطوير من أجل الأداء.
  24. سايلر (2013). "حلول تكرارية لمطابقة أنماط glob" . ستاك أوفرفلو .
  25. هاندي، جاك (2005). "مقارنة السلاسل النصية باستخدام الأحرف البديلة (المطابقة العامة)" . مشروع الكود .
  26. كوكس، روس. "يمكن أن يكون مطابقة التعبيرات النمطية بسيطًا وسريعًا" .
  27. نافارو، غونزالو (10 نوفمبر 2001). "NR-grep: أداة سريعة ومرنة لمطابقة الأنماط" (ملف PDF) . البرمجيات: الممارسة والخبرة . 31 (13): 1265-1312 . doi : 10.1002/spe.411 . S2CID 3175806 .