| تعبير نمطي |
| 1 | نقلها للعربية عبد الرحمن أبو رزمة. التعبيرات النمطية (= Regular expressions أو اختصاراً "regexes") أدوات بحث واستبدال نصية قوية للغاية. تستعمل التعبيرات النمطية عند تحرير النصوص في محرر نصوص، لأغراض: لاختبار ما إذا كان النص يحتوي على عيّنة نصية ما اكتشاف هذه العيّنات المطابقة، إن وجدت استخراج معلومات (نصوص فرعية) من النص إجراء تعديلات على هذا النص. وكما تعمل في محررات النصوص، فإنّ لغات البرمجة عالية المستوى جميعَها تقريباً تتضمّن دعماً للتعبيرات النمطية. |
| 2 | وفي هذا السياق يكون "النص" متغيراً نصياً، ولكن العمليات تبقى ذاتها، بل إنّ بعضَ لغات البرمجة (Perl، JavaScript) تقدّم صيغة مضمّنة للعمليات على التعبيرات النمطية. ولكن ما هي؟ التعبير النمطي مجرد نص. لا حدّ له من حيث الطول، ولكنه في الأعمّ نصٌ قصير. هذه بعض الأمثلة له: I had a \S+ day today [A-Za-z0-9\-_]{3,16} \d\d\d\d-\d\d-\d\d v(\d+)(\.\d+)* TotalMessages="(.*?)" <[^<>]> النصّ في الواقع برنامجُ حاسبٍ صغيرٌ للغاية، وصيغة التعبير النمطي لغة برمجة محددة النطاق صغيرة، ومختصرة. |
| 3 | فإذا أخذت ذلك في الحسبان، لن يصعب عليك أن تتعلم أن: يمكن أن يقسّم كل تعبير نمطي إلى عدة تعليمات مسلسلة. "اعثر على هذا، ثم على ذاك، وبعدها على أحد هؤلاء..." للتعبير النمطي دخل (النص) وخرج (العيّنات المطابقة، وأحياناً النص المعدّل). الأخطاء القواعدية واردة - إذن ليس كل نص تعبيراً نمطياً صالحاً! في صيغتها بعض الغرابة، وربّما، بعض الأهوال. يمكن في بعض الأحيان ترجمة التعبير النمطي ليعمل أسرع. |
| 4 | وكذلك لدينا اختلافات كبيرة في مشغّلات التعبيرات النمطية. وفي هذه الوثيقة سأبقى مركزاً على الصيغة الجوهرية التي تتشارك بها المشغّلات جميعها تقريباً. تمرين احصل على محرر نصوص يدعم التعبيرات النمطية. أنا أفضّل Notepad++. حمّل نص قصة نثرياً مثل Project Gutenberg's version of H. G. Wells'The Time Machine وافتحه. حمّل معجم كلمات مثل هذا، فكّ ضغطه وافتحه. وهذا كل شيء حتى الآن. وسيأتيك المزيد من التمرينات قريباً. |
| 5 | ملاحظة: صيغة التعبيرات النمطية غير متوافقة على الإطلاق مع صيغة سرد أسماء الملفات، مثل*.xml. الصيغة الأساسية للتعبيرات النمطية الحرفيات تحتوي التعبيرات النمطية مزيجاً من المحارف التي تؤخذ حرفياً، والتي تمثل ذاتها، ومحارف خاصة تسمّى metacharacters، والتي تصنع أشياءَ خاصّة. وهنا الأمثلة مجدّداً. سأخطط المحارف الخاصة. I had a \S+ day today [A-Za-z0-9\-_]{3,16} \d\d\d\d-\d\d-\d\d v(\d+)(\.\d+)* TotalMessages="(.*?)" <[^<>]*> تعامل معظم المحارف، يتضمن ذلك جميع محارف الأبجدية معاملةً حرفية. |
| 6 | وهذا يعني أنها تعثر على ذاتها في النص. مثلاً التعبير النمطي cat يعني "اعثر على c، متبوعاً بـ a متبوعاً بـ t". هذا جيد حتى الآن. وهذا يعني يطابق عمليات مربعات حوار البحث المألوفة التابع String.indexOf() من لغة Java التابع strpos() من لغة PHP الخ. ملاحظة: التعبيرات النمطية حساسة لحالة الأحرف، إلّا عندما يصرّح عن خلاف ذلك. على كل حال، جميع المشغّلات تقريباً تقدّم خياراً لتعطيل الحساسية لحالة الأحرف. |
| 7 | ملاحظة أخرى: من المهم أن تعرف ما إذا كان "النص" سلسلة من البايتات أو سلسلة من محارف اليونيكود Unicode. أما إذا اقتصر عملك على المحارف العادية المعرفة ASCII، فإن للحالتين نفس المؤدى، ويمكنك أن تمضي في عملك دون الحاجة لمعرفة الفرق... النقطة أول محارفنا الخاصة هو النقطة؛ .. تعثر النقطة . على أيّ محرفٍ وحيد. يعني التعبير النمطي c.t "اعثر على c، متبوعاً بأي محرفٍ، ثم متبوعاً بـ t". وسيعثر هذا - عندما يطبق في قطعة نصية -، على cat،cot، czt وحتى على النص الحرفي c.t(c، نقطة، t)، ولكن ليس ct، أو coot. |
| 8 | وتؤخذ المسافة بالاعتبار في التعبيرات النمطية. يعني التعبير النمطي c t "اعثر على c، متبوعاً بفراغ، متبوعاً بـ t". يمكن تهريب أي محرف خاص بالمائل الخلفي \. وسيعيد هذا معنى المحرف الخاص إلى مطابقته الحرفية. إذن يعني التعبير النمطي c\.t "اعثر على c، متبوعاً بنقطة، متبوعاً بـ t". المائل الخلفي من المحارف الخاصة، مما يعني أنه يمكن تهريبه ليعني الخط ذاته حرفياً. إذن يعني التعبير النمطي c\\t "اعثر على c، متبوعاً بالمائل الخلفي، متبوعاً بـ t". |
| 9 | تحذير! تعني النقطة .، في بعض المشغّلات؛ اعثر على أي محرف باستثناء محرف فاصل الأسطر. وهذا يعني أن فاصل الأسطر يمكن أن يختلف من مشغّل لآخر أيضاً، راجع وثائق مشغّلك. لكنني سأفترض في هذه الوثيقة أن . ستعثر على أيّ محرف مهما كان. في كلا الحالين، هناك عادةً خيار لتعديل هذا السلوك، والذي يسمّى عادةً DOTALL أو ما شابه. تمرين في ملف المعجم، باستخدام ما تعلمّته من التعبيرات النمطية حتى الآن؛ اعثر على الكلمات بحيث يكون هناك حرفي z أبعد ما يكونان عن بعضهما. |
| 10 | الجواب تمرين في نص The Time Machine، استخدم التعبيرات النمطية لتعثر على جملة تنتهي بظرف. الجواب فئات المحارف فئة المحرف مجموعة من المحارف محصورة بقوسين مربعين. هذا يعني، "اعثر على أيٍّ من هذه المحارف". يعني التعبير النمطي c[aeiou]t، "اعثر على c متبوعاً بحرفٍ صوتي متبوعاً بـ t". وسيجد هذا، عند استعماله في قطعة نصية cat، و cet، و cit، و cot، و cut. يعني التعبير النمطي [0123456789] "اعثر على رقم". |
| … |
Комментарии