لدى معظم المبرمجين نقطة عمياء. فقد يسعدون بتصحيح أخطاء نظام موزع أو صراع مع إطار عمل جديد، ومع ذلك قد يقضون عشرين دقيقة في إجراء تعديل نصي يدوي كان من المفترض أن يستغرق عشر ثوانٍ فقط. والسبب دائماً هو نفسه: التعبيرات النمطية (regex) تبدو وكأنها ضجيج في السطور. النمط النموذجي هو جدار من الخطوط المائلة، والخطوط المائلة العكسية، وعلامات الترقيم التي تبدو وكأنها أُرسلت عبر مودم من التسعينيات. هذه الفوضى البصرية تُرهب الأشخاص الأكفاء وتصرفهم عن مهارة قيمة حقاً.
الخبر السار هو أن regex ليست صعبة، بل هي مكثفة. تضغط الرموز قدراً هائلاً من المعنى في مساحة صغيرة، لذا تظن عينك أنها عشوائية بينما هي في الواقع وصف دقيق للغاية. بمجرد امتلاكك للنموذج الذهني الصحيح، ستتوقف عن محاولة فك تشفير الرموز واحداً تلو الآخر، وبدلاً من ذلك ستقرأ الشكل الذي تصفه. وعندما تفعل ذلك، سيزول هذا الضجيج تماماً.
نمط، وليس برنامجاً
التحول الجذري يكمن في فهم ماهية التعبيرات النمطية حقاً. معظم الكود الذي تكتبه هو كود إجرائي: افعل هذا، ثم افعل ذاك، تحقق من هذا الشرط، كرر الحلقة مرة أخرى. لكن regex ليست إجراءً؛ بل هي نمط ثابت يصف كيف يجب أن يبدو النص. أنت لا تكتب تعليمات حول كيفية البحث، بل تقدم لمحرك المطابقة رسماً تخطيطياً وتتركه يقوم بالمهمة.
فكر في الأمر كأنك تصف أشكالاً بلغة بسيطة:
- رقم مكون من خمس خانات.
- عنوان بريد إلكتروني.
- سطر يبدأ بحرف كبير.
هذا كل ما تفعله regex، باستثناء أنها تستخدم أبجدية مضغوطة. عندما ترى \d{5}، فأنت لا ترى سحراً، بل ترى "رقماً، خمس مرات". وعندما ترى ^[A-Z]، فأنت ترى "بداية سطر، يتبعها حرف كبير واحد". المهارة ليست في الحفظ، بل في تعلم إلقاء نظرة خاطفة على النمط وترجمته مرة أخرى إلى ذلك الوصف البسيط. وبمجرد أن تتمكن من إجراء تلك الترجمة، سيتلاشى عامل الرهبة.
أين يضيع الوقت فعلياً
يميل الناس إلى تعلم regex فقط بعد أن يعانوا بما فيه الكفاية. والنهج الأفضل هو التعرف على المهام التي تتطلب نمطاً قبل أن تضيع فترة بعد الظهر في تنفيذها يدوياً.
إذا كنت بحاجة إلى العثور على كل تاريخ في مستند مكون من مائتي صفحة، فإن regex ستحدد مواقعها في تمريرة واحدة. وإذا كنت بحاجة إلى التحقق مما إذا كان المستخدم قد أدخل رابط URL حقيقياً قبل أن يقبله تطبيقك، فيمكن للنمط فرض الشكل الأساسي للعنوان. وإذا كنت تقوم بتنظيف نص منسوخ من موقع إلكتروني وتحتاج إلى دمج المسافات المتعددة في مسافة واحدة، فإن regex للاستبدال لن تتطلب سوى أربعة رموز. وإذا كنت تستخرج بيانات من سجلات خادم (server logs) غير منظمة، فغالباً ما تكون regex هي الجسر الوحيد المعقول بين النص غير المنظم والتقرير المنظم.
إليك قاعدة بسيطة لتبنيها: إذا كنت على وشك إجراء تعديل نصي خمسين مرة يدوياً، فتوقف. اكتب نمطاً بدلاً من ذلك. التكرار اليدوي ليس بطيئاً فحسب، بل هو غير موثوق أيضاً؛ فقد تفوتك المرة السابعة والأربعون أو تقع في خطأ مطبعي في المرة الثالثة والثلاثين. النمط يقوم بالعمل مرة واحدة، وبشكل صحيح، كما أنه يوثق القاعدة التي كنت تطبقها في المقام الأول.
حلقة تعلم فعالة
لا تحاول كتابة أنماط مثالية من الذاكرة، فهذه هي الطريقة التي يتراكم بها الإحباط. بدلاً من ذلك، اتبع حلقة محكمة تبقيك تتقدم دون أن تضيع في قواعد اللغة (syntax).
- صف الشكل بالكلمات. قبل أن تلمس أي رمز خاص، اكتب بالضبط ما تريده. "أربعة أرقام، يتبعها شرطة، ثم رقمين، ثم شرطة، ثم رقمين". إذا لم تستطع قول ذلك بوضوح، فلن تستطيع تحويله إلى نمط.
- أنشئ مسودة أولية. حوّل وصفك إلى نمط أساسي باستخدام أوسع الرموز المعقولة. لا تقلق بشأن المثالية، فأنت تبني نموذجاً أولياً،
