التبديل في التعبير المنتظم REGEX Alternation
لاتنس أن محرك النمط التعبيري حماسي
كما تعلم أن محرك البحث متحمس دائماً لاسترجاع المطابقات، فبمجرد الحصول على مطابقة يتوقف عن مطابقة الرمز الحالي في النمط لينتقل للرمز التلي، وبالتالي إذا تصورنا أنك تريد البحث داخل نص ما وليكن Settings باستخدام النمط Get|Set|Settings ، إليك ما سيقوم به المحرك:
- المحرك يبدأ قبل G
- يحاول المحرك مطابقة G مع S فلاتحدث مطابقة
- يعرف المحرك أن مازال هناك خيارات أخرى
- ينتقل المحرك للخيار الثاني
- يحاول المحرك مطابقة S في النمط مع S في النص فتحدث مطابقة
- يحاول المحرك مطابقة e في النمط مع e في النص فتحدث مطابقة
- يحاول المحرك مطابقة t في النمط مع t في النص فتحدث مطابقة
- تحقق الخيار الثاني كاملاً ( وهو Set ) فيخرج المحرك من مجموعة الإختيار في النمط، وهذا ليس المطلوب وإنما نريد Settings
هنا يمكننا التفكير في بعض الحلول مثل:
- أن نأخذ في الإعتبار أن محرك البحث متحمس دائماً لاسترجاع المطابقات فنقوم بترتيب النمط حسب أولويات البحث هكذا Get|Settings|Set
- أن نجعل جزء من النص اختياري باستخدام ? هكذا Get|Set(tings)? وبما أن علامة ? طماعة Greedy فستقوم بمحاول البحث عن Settings أولاً.
ماذا إذا كنا نريد البحث في أي من Get|Set|Getting|Setting ؟
إذا قمنا بتحليل الكلمات ستجد أن المطلوب هو:
- البحث عن Get or Set
- أو أي منهم متبوعاً بـ (ting)
وبالتالي يكون النمط بهذا الشكل (Get|Set)(ting)?
التتبع الخلفي في البدائل
مرة أخرى، التتبع الخلفي Regex Backtracking هو عملية الرجوع لحالة ما تم تخزينها في ذاكرة المحرك بهدف التخلي عن جزء من المطابقة عند هذه الحالة أو تجربة بديل آخر بهدف مطابقة كامل النمط، وبالتالي عند تطبيق النمط \b(Set|SetValue)\b على النص SetValue سيقوم المحرك بالآتي:
- يقوم المحرك بمطابقة \b مع بداية النص
- يدخل المحرك المجموعة
- هل S في النمط تطابق S في النص؟ نعم
- هل e في النمط تطابق e في النص؟ نعم
- هل t في النمط تطابق t في النص؟ نعم. هنا يتحقق أول خيار في المجموعة، فيخرج المحرك من المجموعة
- هل \b في النمط تطابق V في النص؟ لا. هنا يفشل النمط، ولكن المحرك يعرف أن هناك خيار آخر يمكن تجربته
- يقوم المحرك بالرجوع للخلف داخل المجموعة لتجربة الخيار الثاني، ويعود في النص مرة أخرى إلى بداية النص، وبالطبع يحدث تطابق عند استخدام الخيار الثاني.
أي أن المحرك قام أيضا بالرجوع لحالة ما مخزنة في ذاكرته لتجربة خيار آخر.