تعبير نمطي
التعابير النمطية (بالإنجليزية: Regular expression) هي أسلوب لوصف النصوص والتعرف عليها بطريق وصف مكوناتها من رموز، ووصف علاقات تلك الرموز من توال وتكرار، وذلك بكيفية نظامية يمكن لخوارزمية أن تفسرها وتطبقها على نص مُعطى لاستخراج الجزء المنطبق عليه التعبير النمطي.
تستخدم التعابير النمطية في الحوسبة لمعالجة النصوص وفي مولدات مفسرات لغات البرمجة ولتدقيق مُدخلات البرمجيات، وتوجد تطبيقات لها في معظم لغات البرمجة. نشأ المفهوم في الخمسينيات عندما صاغ عالم الرياضيات الأمريكي ستيفن كول كلاين وصفاً للغة عادية. أصبح المفهوم شائع الاستخدام مع أدوات معالجة النصوص من Unix. منذ ثمانينات القرن العشرين، توجد جمل مختلفة لكتابة التعبيرات العادية، أحدها هو معيار POSIX وغيرها.
نشأة التعبيرات النمطية
عدلنشأت التعبيرات النمطية في عام 1951، عندما وصف العالم الرياضي ستيفن كول كلين اللغات العادية باستخدام تدوينه الرياضي المسمى «مجموعات منتظمة». نشأت هذه في علم الكمبيوتر النظري، في الحقول الفرعية لنظرية الأوتوماتا (نماذج الحساب) ووصف وتصنيف اللغات الرسمية. تتضمن التطبيقات المبكرة الأخرى لمطابقة الأنماط لغة SNOBOL، التي لم تستخدم تعابير عادية، ولكن بدلاً من ذلك تم بناء بنيات مطابقة خاصة بها. دخلت التعبيرات المنتظمة استخدامًا شائعًا منذ عام 1968 في استخدامين: مطابقة النمط في محرر النص والتحليل المعجمى في المترجم. من بين المظاهر الأولى للتعبيرات العادية في شكل برنامج كان كين ثومبسون يقوم بتأليف تدوين كلين في محرر المحرر (QED) كوسيلة لمطابقة الأنماط في الملفات النصية.[1] للسرعة، قام تومبسون بتطبيق مطابقة التعبير المنتظم من خلال التجميع في الوقت المناسب (JIT) إلى كود IBM 7094 على نظام مشاركة الوقت المناسب. وقد أضاف لاحقًا هذه الإمكانية إلى محرر محرر Unix، مما أدى في النهاية إلى استخدام أداة البحث الشائعة grep's للتعبيرات اللامنطقية ("grep" هي كلمة مشتقة من أمر البحث العادي في محرر التحرير: g/re/p تعني «البحث الشامل عن التعبير العادي وطباعة خطوط المطابقة».[2] في نفس الوقت تقريباً عندما طور تومسون QED، قامت مجموعة من الباحثين بما في ذلك Douglas T. Ross بتطبيق أداة مبنية على التعبيرات العادية التي تستخدم في تحليل المفردات في تصميم المترجم.
مفاهيم أساسية
عدلالتعبير العادي، الذي يُطلق عليه غالباً النمط، هو تعبير يستخدم لتحديد مجموعة من السلاسل المطلوبة لغرض معين. طريقة بسيطة لتحديد مجموعة محدودة من السلاسل هي أن تدرج عناصرها أو أعضائها. ومع ذلك، فغالبًا ما تكون هناك طرق أكثر تحديدًا لتحديد مجموعة السلاسل المطلوبة. على سبيل المثال، يمكن تحديد المجموعة التي تحتوي على السلاسل الثلاث "Handel" و "Händel" و "Haendel" من خلال النمط:'H(ä|ae?)ndel'نقول أن هذا النمط يتطابق مع كل من السلاسل الثلاثة. في معظم الأشكال الشكلية، إذا كان هناك تعبير عادي واحد على الأقل يتطابق مع مجموعة معينة، فسيكون هناك عدد لا نهائي من التعبير العادي الآخر الذي يطابقها أيضًا - فالمواصفات ليست فريدة من نوعها. معظم الشكليات توفر العمليات التالية لبناء تعبيرات نمطية.
منطقي «أو» : شريط عمودي يفصل بين البدائل. فمثلا،gray|grey يمكن أن يتطابق مع "gray" أو "grey". التجميع : تستخدم الأقواس لتعريف نطاق وأسبقية المشغلين (بين الاستخدامات الأخرى). على سبيل المثال،gray|grey و gr(a|e)yهي أنماط مكافئة تصف كلاهما مجموعة "gray" أو "grey". تحديد الكميات : يحدد الكمي بعد الرمز المميز (مثل الحرف) أو المجموعة عدد مرات سماح حدوث هذا العنصر السابق. القياسات الأكثر شيوعًا?,*,+. ؟ تشير علامة الأستفهام إلى 0 أو 1 من التكرار. * تشير علامه النجمة إلى 0 أو أكثر من التكرار. + تشير علامه الجمع إلى 1 أو أكثر من التكرار.
الأحرف العادية
عدليمكن استخدام الأحرف العادية في التعبيرات المنتظمة، للبحث عن كلمة: فصل، فكل ما عليك هو كتابة الكلمة في مربع البحث وسيتم البحث عنها.
جميع الأحرف يمكن البحث عنها مباشرة، فمثلا لكي نبحث عن الحرف س، فإنا نكتب س مجردة فيبحث عنها يستثنى من ذلك 11 رمزا هي (الرموز الخاصة)، وهي تلك الرموز التي لها معان خاصة في التعبيرات القياسية وهي:
- [ : معقوفة فاتحة
- \ : ابطال فعالية الرمز ومعاملته كحرف أو رمز عادي.
- ^ : بداية الصفحة.
- $ : علامة دولار. نهاية الصفحة.
- . : نقطة. أي شيء عدا فاصل الأسطر.
- | : عمود عمودي.
- ? : علامة استفهام.
- * : علامة نجمة.
- + : علامة زائد.
- (: قوس فاتح.
- ): قوس غالق.
للبحث عن أي حرف غير الـ 11 السابقة، اكتب الحرف مباشرة. أما للبحث عن رمز من هذه الرموز الـ 11 فينبغي أن توضع قبله العلامة \ وإلا فسيكون للرمز معناه الخاص.. فمثلا: لكي تبحث عن 1+1=2
ينبغي أن تكتب التعبير الآتي
1\+1=2
لاحظ، وضعنا العلامة \ قبل حرف + لأنه من الرموز الخاصة، ونحن هنا لا نريد معناه الخاص، بل نريد البحث عنه كما هو.
فئات الأحرف
عدلإذا وضعت عددا من الأحرف داخل المعقوفين [ ]، فهذا ما يسمى بفئات الأحرف. مثلا [ة رك].
ومعناها أنك تريد حرفا واحدا من هذه الفئة. تذكر: حرفا واحدا، فالبحث عن فصل يجد الكلمة كلها أي الحروف الثلاثة فصل متوالية أما البحث عن [فصل] فهو يجد حرفا واحدا من الثلاثة، ف أو ص أو ل وليس الكلمة كلها.
يمكن وضع مجالات داخل الأقواس، مثلا [0-9] يبحث عن أي رقم من صفر إلى 9 لكنه يجد رقما واحد مثل 5 وليس مثل 549.
مهما وضعت داخل قوس المجموعة، تذكر أنه يمثل رمزا واحدا، فمثلا
[0-9a-zA-Z]
يجد أي حرف أجنبي كبير أو صغير أو رقم، لكنه يعود بواحد فقط من هؤلاء (أول واحد يصادفه).
هناك في القوائم (انظر صورتها فيما سبق) أوامر لإدراج: حرف عربي، تشكيل، حرف عربي أو تشكيل، حرف أجنبي. وهي كلها تطبيق على استعمال فئات الأحرف فهي تعبيرات قياسية جاهزة معدة مسبقا، تدرج في مربع النص بمجرد اختيار الأمر.
من أهم استخدامات المجموعات هي: إيجاد الكلمة حتى لو بها خطأ إملائي فمثلا عندما تبحث عن [أا]حمد، فمعنى هذا أنك تريد أن تبحث عن أحمد أو احمد، سواء أكان هذا أم هذا، فكلاهما سيعتبر نتيجة صحيحة.
- تطبيق: هل يمكن أن تبحث عن [آإا]حمد وتستبدله بـ أحمد، لتصحيح الخطأ الإملائي
- الجواب: لا، لأن أحمد صحيحة كاسم علم واحمد أيضا صحيحة كفعل أمر ثلاثي همزته همزة وصل كقولك: احمد الله
لكن: يمكن مثلا استبدال الإمام [آإا]حمد بـ الإمام أحمد، أو [آإا]حمد بن حنبل بـ أحمد بن حنبل
ما سبق كان مثالا فقط، ومع التفكير، ستجد أن هناك ما لا يحصى من الاستخدامات للتعبيرات القياسية، يمكن استخدامها لإصلاح كثير من الأخطاء المتكررة في النصوص
الفئات المنفية
عدلإذا وضعت هذه العلامة ^ قبل الأحرف داخل المعكوفين هكذا [^] ، فمعناه أنك تريد أي شيء ما عدا هذه الأحرف، مثلا [ة رك^]
وكما سبق أيضا فإنها تجد حرفا واحدا بشرط ألا يكون في المجموعة المنفية، فالمثال السابق[ة رك^] يجد ب أو ت أو ج أو... أي حرف سوى ة رك.
بعض الرموز الخاصة
عدلنذكر هنا بعضا من الرموز الخاصة ومعانيها، وغالبها ستجده في القوائم لإدراجه بسهولة
\s أي مسافة بيضاء، وهي كل ما لا ترى له جرما مطبوعا، مثل: المسافة وفاصل الأسطر (زر Enter)، ونحوها
\S أي شيء بخلاف المسافة البيضاء
\d أي رقم 0-9
\D أي شيء ليس رقما
\r\n فاصل الأسطر (= زر Enter)
المواضع
عدلوهي لا تقابل حرفا معينا بل تقابل موضعا مثلا: أول الصفحة، أول السطر ...
فمثلا، للبحث عن كلمة فصل بشرط أن تكون في أول الصفحة، اكتب ^فصل.
لتبحث عن كلمة في أول السطر مثلا، يمكن استعمال فاصل الأسطر قبلها، لكنه لن يجد الكلمة لو كانت في أول الصفحة (مع أنها في بداية السطر)، لأنه ليس قبلها فاصل أسطر، لهذا تجد في القوائم - كمحاولة لحل هذه المشكلة - :
- بداية السطر: وهو يقوم بإدراج التعبير (?:^|\r\n) وهو يعني بداية السطر (أو بداية الصفحة)
- نهاية السطر: وهو يقوم بإدراج التعبير (?:$|\r\n) وهو يعني نهاية السطر (أو نهاية الصفحة)
الاستخدامات
عدلتُعد Regexes مفيدة في مجموعة متنوعة من مهام معالجة النصوص، وعمومًا معالجة السلسلة، حيث لا يلزم أن تكون البيانات نصية. وتشمل التطبيقات الشائعة التحقق من صحة البيانات، وكشط البيانات (وخاصة كشط الويب)، ومعالجة البيانات، والتحليل البسيط، وإنتاج أنظمة تلوين صياغة الشيفرات البرمجية، والعديد من المهام الأخرى.
في حين أن regexes سيكون مفيدًا على محركات البحث على الإنترنت، إلا أن معالجتها عبر قاعدة البيانات بأكملها يمكن أن تستهلك موارد الكمبيوتر المفرطة اعتمادًا على تعقيد التصميم المعتاد وتصميمه. على الرغم من أنه في كثير من الحالات يمكن لمسؤولي النظام تشغيل الاستعلامات المستندة إلى regex داخليًا، إلا أن معظم محركات البحث لا تقدم دعمًا للتعبير العادي للجمهور. استثناءات ملحوظة: Google Code Search، Exalead. ومع ذلك، فقد تم إغلاق Google Code Search اعتبارًا من مارس 2013.[3]
مراجع
عدل- ^ "History of QED". مؤرشف من الأصل في 1999-02-21.
- ^ "grep". مؤرشف من الأصل في 2019-02-02. اطلع عليه بتاريخ 2021-04-24.
- ^ Replacement for Google Code Search? - Stack Overflow نسخة محفوظة 09 نوفمبر 2017 على موقع واي باك مشين.