تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
أجمل مقدمة فى ال Regular Expression
#1
كاتب الموضوع : اسماعيل عمر


بسم الله الرحمن الرحيم


والصلاة والسلام على أشرف المرسلين سيدنا محمد وعلى آله وصحبه أجمعين وبعد:
طبعا من المهم جدا لنا كمبرمجين تعلم Regular Expression لأنه يوفر الكثير من الوقت والجهد وبما أن أفضل الشروحات في هذا الموضوع بالغة الأنجليزية وبما أن الشروحات الموجوده بالغة العربية ليست بجودة التي بالغة الأنجليزية ، كان لا بد لنا من ترجمة المقالآت إلى العربية وطبعا كثير من اخواننا لغتهم الأنجليزية ضعيفة فعندما يترجمون تكون الترجمة ليست بالكفائة العالية
المهم
حاولت أتعلم ال Regular Expression ووجدت الشرح في ميكروسفت أهم الشروحات ولكن طبعا بالغة الأنجليزية وأنا متوسط في اللغة فيتطلب مني الأمر الرجوع للقاموس أكثر من مرة وبعد البحث في الأنترنت وجدت مقالة مهمة جدا مترجمة للعربية من موقع Codeproject وقامت أحد الأخوات في منتدى الفريق العربي للبرمجة بترجمت المقالة من الأنجليزية للعربية وهي الأخت يمانية فحببت أن أقوم بنقل المقالة ليستفيد منها الجميع

ونصيحتي لمن يفرأ المقالة أن يقوم بتحميل البرنامج الموجود في المقالة وتطبيق الدرس في البرنامج لكي يفهم الموضوع بطريقة صحيحة

المقالة:
احاول في هذا الموضوع ترجمة شرح ممتاز لل Regular expression وجدته في الموقع الشهير CodeProject


من اجل متابعة هذا المقال نحتاج الى تحميل برنامج حتى نطبق الأمثلة ، البرنامج وال source موجود على هذا الرابط

هنا
http://www.mediafire.com/?kqtr71zwl3qv2u4

البرنامج سهل ويحتوي على Regular expression يختصر الى Regex ، ويكون أخضر اذا كان ال Regex صحيحا وأحمر اذا كان غير صحيح ، بالانتقال الى Test يكون أحمر اذا كان النص لايطابق ال Regex واخضر اذا كان النص صحيحا ويطابق ال Regex


الهدف من هذه المقالة هو جعل ال Regular expression سهلة ، وبعد الانتهاء منها يتوقع ان تكون قادرا على كتابة validators simple( صيغ للتأكد من صحة مدخلات ما)
وبعد الانتهاء منها سيكون لديك معرفة كافية تجعلك تتعمقك في الفهم بشكل أكبر بمجهود معقول
مقدمة :

يقول كاتب المقال :لطالما تعمدت تجنب ال Regular expression ، مرت العشر السنوات الاخيرة وانا ابذل جهدا كبيرا للهروب .وأخير قرأت عن الموضوع ، وفي ذلك الحين كنت قد تعلمت لغتان اجنبيتان لانه الأمر كان أسهل بالنسبة لي من تعلم ال Regular expression
( طبعا هذا رأيه الشخصي ، لكن قد يجد البعض ايضا ان الموضوع معقد)


من المهم ان تعرف ان ال بيئة ال .NET تقدم دعما كبيرا جدا لل Regular expression ومن الصعب جدا التحقق من صحة المدخلات بدونها


====================
هناك ثلاث طرح لعمل Validation
Submission validation: وتعني ان يتم التحقق من المدخلات عند اكمال الفورم
Completion validation: وتعني التحقق من المدخلات في حين اكمال كل حق لوحده
Key-press validation: وتعني التحقق من الكلمات حال كتابتها

بطبيعة الحال الطريقة الأولى متعبة ، فمن غير المناسب ترك المستخدم يدخل بيانات خاطئة ولاتنبهه الا بعد ان كتب كما كبيرا من البيانات وتظهر له قائمة طويلة عريضة بالااخطاء، يجب ان ينبه المستخدم الى الاخطاء حال كتابتها

=================================

نبدأ بكتابة بعض ال Regular Expression لاستخدمها لعمل Validators
ال Regular expression ماهو الى توصيف لشكل البيانات المقبولة في صيغة كود


*.docفي الحقيقة هذا ليس Regular expression هذا من ميكروسفت ورد وبالتحديد من نافذة حفظ او فتح الملفات، وهو عبارة عن مجموعة من الأحرف تعبر عن شيء معين وهي اظهر لي كل الملفات التي تحوي هذا الامتداد

هذا المثال كانت للتقريب فقط ،لكن معنى الرموز سيختلف فمثلا النجمة في المثال أعلاه يختلف معناها في ال Regular expression

عند هذه النقطة ، قم بتشغل التطبيق الذي حملته فسوف نستخدمه ابتداءا من الان

الرمز "^" والزمز "$"، من ابرز الرموز في ال Regular expression فهما يحددان بداية ونهاية النص على التوالي ..
قم بكتابتهما في التطبيق


، فور كتابتهم ستلاحظ تحول الحقلين في التطبيق الى أخضر ، Regx دلالة على ان ال Regular expression الذي ادخلته صحيحا و Test دلالة على انه يسمح ان يكون النص فارغا
الان ، حاول كتابة اي شيء في حقل ال Test سوف تلاحظ تحول المربع الى احمر بغض النظر عن النص الذي تكتبه ، هذا لأن ال Regex الذي كتبته يعني ان التعبير يطابق اي نص فارغ لاغير
بمعنى اخر ، هذا الرمز "^" يعني بداية ال Regular Expression والرمز "$" يعني نهاية ال Regular Expression
لنتابع كيف يمكننا استخدامها ،ادخل هذه الرموز في التطبيق في حقل Regex box


^4$الرمز هنا يعني اقرأ أي نص يبدأ من أول السطر بالرقم 4 وينتهي السطر بعد الرقم مباشرة، بعنى اخر اقر سطر من النص يحتوي الرقم 4 فقط

عند كتابتك للرمز في حقل Regex سوف يتحول حقل ال Test الى اللون الأحمر ، هذا لأن ال Regular الذي كتبناه لايقرأ نصا فارغ


الان :

* اكتب الرقم 4 في حقل test ،، يتحول لونه الى الأخضر ، دليل ان النص الذي كتبته وهو ال 4 صحيح
* استبدل الرقم 4 بأي رقم اخر او اي حرف ،، يتحول لون الصندوق الى الأحمر دليل ان النص خاطيء
*امسح اي نص واكتب ال 4 مرة أخرى
سنقوم بعمل تعديل بسيط على ال regular expression بازالة رمز ^ و$ ، فقط اكتب الرقم 4 سيكون لون الصندوق أخضر، دليل ان Regex مقبول
الان لدينا نفس ال Regex السابق الا اننا استبعدنا رمزي ^ و $ والذين كما اشرنا يدلان على البداية والنهاية

لنجرب الان :
* اكتب الرقم 4 في Test box يتحول اللون الى اخضر ،، مقبول


*اكتب اي رمز او رقم الى جانب ال 4 ، لاحظ الفرق ، هنا يظل ال test box اخضر بعكس المثال السابق ،طالما ان الحروف التي تكتبها تحتوي 4 يظل الصندوق اخضر ،


*امسح الرقم 4 واكتب اي نص اخر يتحول لون الصندوق الى الأحمر
هذا لانه بعدما ازلنا ^ ,$ فهذا يعني ان regex يقبل اي نص يتحوي 4 ، في المثال السابق
ومع رمزي ^ ,$ يعني ان ال regex يقبل ال 4 لاغير (بداية ونهاية)
=============================
Some Useful Validations
=============================
حتى الان لم نكتب اي validations مفيدة ، نبدأ الان ..


^[0-9]$هذا التعبير يعني اقرأ اي رقم من 0 الى 9 ، وعندما تكتب اي رقم مفرد في صندوق ال Test يتحول الى الأخضر
حاول كتابة اي رقم اخر ،، يتحول الصندوق الى الأحمر (غير مقبول)،


لنحاول ان نجعل التعبير اكثر مرونة ، نضيف * قبل اخر التعبير


^[0-9]*$هذا التعبير يعني اقرأ اي سلسلة من الأرقام تتكون من 0-9 ، ولاحظ انه بمجرد اضافة النجمة يتحول ال Test box الى اللون الأخضر ، يعني ان الفراغات مسموحة
الان تستطيع كتابة اي عدد من الأرقام ،، لكن لو ادخلت حرفا يتحول test box الى احمر فالتعبير يقرأ فقط الأرقام
لو استبدلنا النجمة بعلامة +



الفارق الوحيد هنا هو انه الفراغات غير مسموحة ولهذا نرى الحقل Test باللون الأحمر وهو فارغ عكس المثال الذي قبله حيث كانت النجمة موجودة

Optional Elements
==============

التعبير الأخير الذي كتبناه يقرأ ارقام صحيحة فقط ، ولايقرأ ارقام حقيقية تحتوي على كسور مثلا

نجرب ، في التطبيق نكتب الرقم التالي : 123.454545
حالم تكتب العلامة العشرية يتحول حقل ال Test الى احمر ( رقم غير مقبول) ، مالحل ؟؟

جرب كتابة هذا ال Regex


^[0-9]+\.$الان يمكنك كتابة رقم ينتهي بعلامة عشرية ،، من الضروري كتابة ال backslash-period لان هناك في ال Regular expression يوجد رمز (.) والباك سلاش تعني اننا نعنيها حقا وليس الرمز الخاص في ال regular expression بمعني Escap

لكن لاحظ هنا ان حقل test يظل احمر حتى تكتب العلامة العشرية ،، هذا يعني ان العلامة العشرية مطلوبة وليست اختيارية ،، هذا ليس وضعا طبيعيا، اليس كذلك ؟؟؟

الحل بأن نجعل العلامة العشرية اختيارية وليست مطلوبة ، لعمل ذلك نستخدم رمز (؟)
كالتالي:


^[0-9]+\.?$الان حاول كتابة ارقام مرة اخرى ، مثلا 123.45 ،، سيظل حقل ال Test اخضر حتى تبدأ بكتابة اول رقم بعد الخانة العشرية ، عندها سيتحول الحقل الى احمر ،، مازالت هناك مشكلة !!!

كما نلاحظ ، اخر شيء مكتوب في ال regex هو العلامة العشرية ،، لكن نحن نريد ان نكتب ارقام بعد الفاصلة ايضا ..الحل كتابة ال Regex بهذا الشكل :


^[0-9]*\.?[0-9]*$الان تستطيع كتابة الرقم بشكل طبيعي قبل وبعد العلامة العشرية الرقم صحيح




Groups and Alternates
==========================



Groups()
تستخدم الأقواس لعمل validations لاكثر من عنصر ، حيث نضعها جميعها داخل قوسين
هذا مثال لاستخدام الفاصلة مع الأرقام


^([0-9]*,?)*$هذا ال regex يعني اقرأ نص من الأرقام يمكن ان يحتوي على فاصلة والنجمة بعد الأقواس تعني انه يمكن تكرار الأرقام والفواصل لعدد غير محدود (قم بعمل تجارب على هذا ال regex) الاقواس شكلت حدود للمجموعة (الارقام والفاصلة)
Alternates
احيان قد نحتاج في تعبيرنا (إما كذا أو كذا )


في المثال السابق ، لايمكننا اضافة فراغات بعد الفواصل ،، لو اردنا ذلك لما استطعنا باستخدام التعبير السابق
جرب ذلك وسترى صندوق ال Test يتحول الى الأحمر لان الفراغات غير مقبولة
ماالحل اذا ؟؟؟

يمكن تعديل التعبير السابق واضافة خاصية تسمى alternates ويعبر عنها بالرمز (|) pipes حيث نضعها داخل الأقواس او مايسمى group

بعد اضافة هذه الخاصية الى التعبير السابق ليصبح


^([0-9]*(,|, )?)*$لاحظ وجود فراغ بعد الفاصلة الثانية

الان ال Regex يقرأ : الارقام متبوعة بفاصلة او بفاصلة وفراغ ،الان جرب اضافة فراغات بعد الفواصل سيبقى الصندوق أخضر طالما تقوم بادخال فرغ واحد فقط
لكن ماذا لو اردنا ان نسمح للمستخدم باضافة فراغات غير محدودة ،، فكر قليلا !!!

الاجابة مرت علينا وهي اضافة رمز * ، لصيبح الرمز كالتالي:


^([0-9]*(,|, *)?)*$الان التعبير يعمل بشكل صحيح ، فهو يقرأ مجموعة من الأرقام متبوعة بفاصلة وفراغ او اكثر ....

يمكن اضافة تعديل بسيط على ال Regex، فلو لاحظنا وجود ال * بعد رمز (|) يعني وجود صفر فراغ او اكثر ، مما يعني ان ان الفاصلة الأولى قبل رمز(|) وجودها لامعنى له ، طالما ان التعبير التالي يعني وجود صفر فراغ او اكثر

لذا يمكننا اختصار التعبير ليصبح


^([0-9]*(, *)?)*$هذا التعبير اكثر اختصارا واسهل

Other Types of Data
========================

الأنواع الأخرى من البيانات سهلة نوعا ما لان لديها صيغ ثابته

Dates

نفترض اننا نريد تحديدة صيغة كتابة التاريخ كالتالي:mm/dd/yyyy


^([0-9]|/)*$هذا التعبير يقرأ نصا من الارقام او (|) السلاشات / ، هذا التعبير ينبه المستخدم حالا في حال كتب شيء غير مقبول مثل الحروف a,b,c


لكن لاحظ ان التعبير لايقبل داش (-) مع انها مستخدمة في التواريخ ، يمكن اضافتها الى التعبير السابق باستخدام alternative group


^([0-9]|/|-)*$بالأخير ، ولجعل التعبير اكثر مرونة يمكن عمل completion validator لضمان كتابة التاريخ بشكل صحيح كالتالي:


^[0-2]?[1-9](/|-)[0-3]?[0-9](/|-)[1-2][0-9][0-9][0-9]$هذا التعبير يتحقق من كل كاركتر في التاريخ ، فهو يقرأ نص
الكاركتر الأول منه إما 0 او 1 او 2 وهو اختياري
الكاركتر الثاني ، اي رقم بين 1-9
الكاركتر الثالث ، يااما داش او سلاش
الكاركتر الرابع اما 1 او 2 او 3 وهو اختياري
الخامس اي رقم بين1-9
السادس داش او سلاش
السابع الذي يمثل السنة 1او2
ثم الثلاثة الكاركترز الباقية تكون اي رقم بين 1-9

لاحظ في التعبير أعلاه [0-2] هنا حددنا مجموعة الأرقام الممكنة واختصرناها الى 3 ارقام بدل المجموعة كاملة
[0-9A-F] هذه تجمع الأرقام ال hexadecimal ،هذه الطريقة او هذه الصيغة تسمى character class, هذا الcharacter class يسمح بالحروف الكبتل [A-Z] ، بينما هذا [A-Za-z] يسمح للكبتل والاسمول

نجري بعض التجارب على التعبير السابق







ال Regex الذي كتبناه يقوم بعمل جيد ، لكن لاحظ الصورة الثانية !!! لايوجد شهر رقمه 32!!!

بطبيعة الحال ممكن ان نطور ال Regex ليصبح اكثر فاعلية لكن الأسهل هو استخدامال .NET في هذه الحالة فهناك دالة جاهزة تقوم بالتحقق من صحة التاريخ وهي موضحة بالتفصيل بالمشاركة التالية



Telephone numbers
صيغة ارقام التلفون ، صيغتها ثابته لذا فعملية التحقق من صحة المدخلات اسهل نوعا ما ، مثلا في الولايات المتحدة تأخذ الشكل (nnn) nnn-nnnn
حيث n يمثل اي رقم ،يمكننا استخدام التعبير التالي :


^(\(|\d| |-|\))*$الان الرقم المطلوب التحقق منه يحتوي على اقواس والاقواس كما عرفنا لها معنى خاص في ال regular expression لذافقد استخدمنا escap والتي تمثل ب \ ، يعني اننا نعني قوس حرفيا وليس الرمز المعروف بال regular expression ، شيء جديد في التعبير الأخير الذي استخدمنها d\ وهي اختصار ل [0-9]

التعبير اعلاه يعني اقرا نص يحتوي على قوس مفتوح او رقم او فراغ او قوس او داش او قوس مغلق
التعبير او الصيغة اعلاه تضمن بأن المستخدم لايدخل اي كاركتر خاطيء مثل الحروف a,b
لكنه لايقدم حل مثالي ، فنحن لم نحدد اين الاقواس واين الارقام وعددها ،، من اجل ذلك يمكن انشاء completion validator

^\(\d\d\d\) \d\d\d-\d\d\d\d$هذا التعبير افضل بكثير فهو يحدد مكان الاقواس وعدد الكاركترز وترتيبها ....


=======================================

هذه كانت مقدمة بسيطةللـRegular Expression ، بعد هذا المقال يمكنك ان تتوسع بفهم الموضوع بشكل أكبر

أتمنى ان اكون وفقت في توصيل الفكرة ،، ولمن يحبذ اللغة الانجليزية ...

رابط المقالة الأصلية :

http://www.codeproje...egexTester.aspx

===========================================

للتوسع أكثر في الموضوع :

Learn Regular Expression (Regex) syntax with C# and .NET
http://www.radsoftware.com.au/articl...arnsyntax.aspx
}}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم