المتابعون للمدونة

الأحد، 4 نوفمبر 2018

التعبيرات النمطية اللفظية Verex:


التعبيرات النمطية اللفظية Verex

هناك بعض الصعوبة في التعبيرات النمطية Regular expressions (Regex)، فهي تستخدم الرموز لتكوين صيغ مختصرة، وهو ما يجعل بعض التعبيرات النمطية تبدو معقدة وغير مفهومة.. لهذا ظهرت بعض مكتبات الكود التي تحتوي على دوال بأسماء إنجليزية واضحة لتكوين التعبير النمطي بصورة سهلة ومقروءة.. وقد كتبت واحدة منها بنفسي أسميتها Verex اختصارا لـ Verbal Regex.. وقد أنشأت هذه المكتبة متوافقة مع الإصدار الثاني لمعايير دوت نت .NET Standard 2.0 لتصلح للعمل مع أي مشروع يستهدف إطار العمل أو نواة دوت نت أو غير ذلك، ونشرتها مفتوحة المصدر على موقع github:
حيث يمكنكم تنزيل كود المشروع كاملا على أجهزتكم لو أردتم، وأنا أنصح بهذا من يريد تدريبا جيدا على البرمجة الموجهة بالكائنات، فقد بنيت وحدات التعبيرات النمطية كفئات واستخدمت الوراثة والفئات المجردة بكثافة لجعل الكود أبسط وأكثر اختصارا.
كما أن المشروع يحتوي على وحدات اختبار Unit Tests تختبر كل جزء من الكود، وهذا نفعني كلما عدلت جزءا من المشروع، فأحيانا كانت تكشف لي الاختبارات أن التعديل قد سبب مشكلة في أجزاء أخرى، وهذا جعلني أصحح الأخطاء بسرعة.
أما من لا يهتم بكود المشروع، فقد نشرته كحزمة إضافية NuGet ليمكنك إضافتها إلى مشاريعك كمكتبة ربط dll.. هذا هو رابط الحزمة:
ويمكن أن تضيف هذه الحزمة إلى مشاريعك مباشرة.. من القائمة Project اضغط الأمر Manage NuGet Packages، واكتب في مربع البحث الاسم Verex لتظهر لك هذه الحزمة، وأضفها إلى المشروع كما شرحنا في الفصل الأول من كتاب من الصفر إلى الاحتراف برمجة إطار العمل ونواة دوت نت.
الآن يمكنك استخدام التعبيرات اللفظية في مشروعك، ولا تنسَ إضافة جمل تضمين النطاقات التالية أعلى صفحة الكود:
VB.NET:

Imports RegexBuilder
Imports RegexBuilder.Patterns
Imports RegexBuilder.Patterns.Symbols
 
C#:

using RegexBuilder
using static RegexBuilder.Patterns;
using static RegexBuilder.Patterns.Symbols;
وبهذا يمكنك أن تكتب أسماء الخصائص والوسائل الموجودة في الفئتين Patterns و Patterns.Symbols في الكود مباشرة بدون نسبتها إلى اسم الفئة.
هكذا مثلا يمكن كتابة صيغة عنوان IP باستخدام Verex.. لاحظ أن عنوان IP يحتوي على أربع مجموعات من الأرقام بحد أقصى، كل رقم منها ينحصر بين صفر و 255 بشرط ألا يوجد صفر على أقصى يسار أي رقم.. للأسف لا توجد صيفة مباشرة في التعبيرات النمطية لفحص نطاق من الأعداد، ولهذا يجب كتابة صيغة معقدة لفحص احتمالات الأرقام المتوالية.. فمثلا: العدد المسموح أن نراه في أي جزء من عنوان IP يحقق الشروط التالية:
- قد يبدأ ب 1 (يوجد أو لا يوجد) بعده رقم أو اثنان .. هذا يطابق أعدادا مثل 123 أو 23 أو 3.. هذا يغطي الأرقام من 0 إلى 199.
- أو يبدأ ب 2 لتغطية الأعداد من 200 إلى 255.. هذا يعني أن الخانة الثانية بعد الرقم 2 قد تحتوي على الأعداد من 0 إلى 4، وفي هذه الحالة يمكن أن تحتوي الخانة الثالثة على أي رقم.. أما لو كانت الخانة الثانية تحتوي على الرقم 5، فيجب أن تحتوي الخانة الثالثة على الأرقام من 0 إلى 5 فقط.. هكذا يمكن كتابة كل هذه الشروط:

VB.NET:

Dim validNo =
             (Maybe("1") + Digit(1, 2) Or
                ("2" + (
                             (InRange("0"c, "4"c) + Digit) Or
                    ("5" + InRange("0"c, "5"c))
                            )
             ) 

Dim IP = WordEdge + validNo + ("." + validNo)(3) + WordEdge
Console.WriteLine(IP.Expression) 

C#:

var validNo =
            (Maybe("1") + Digit[1, 2]) |
              ("2" + (
                            (InRange('0', '4') + Digit) |
                            ("5" + InRange('0', '5'))
                          )
            ); 

var IP = WordEdge + validNo + ("." + validNo)[3] + WordEdge;
Console.WriteLine(IP.Expression);
الكود السابق سيعرض على الشاشة التعبير النمطي التالي:
\b(?:1?\d{1,2}|2(?:[0-4]\d|5[0-5]))(?:\.(?:1?\d{1,2}|2(?:[0-4]\d|5[0-5]))){3}\b
وهو يصلح لمطابقة أي عنوان IP مثل:
192.220.10.1
أظن أنك ستتفق معي أن استخدام Verex يجعل الأمور أوضح وأسهل، حتى لو بدا كوده أطول قليلا!
وستجدون أمثلة أخرى هنا:
لاحظ أن Verex لا يغني عن تعلم Regex وفهمه جيدا أولا.. لهذا شرحت كليهما في الفصل الثامن من مرجع إطار العمل.

 

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.

صفحة الشاعر