الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس متقدم:Regular Expressions وكيفيةالتعامل معها.

مغلق
بدأه عبد القادر حجار في 29 يناير 2003 · 1 رد · 7,261 مشاهدة · في قسم الدروس والمواضيع الهامة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

إن كنت لا تعرف الـ Regular expression فتأكد بأنه قد فاتك الكثير، لكن ليس بعد الآن.

بداية الـ Regular Expression كانت مع البيرل ثم تطورت و ظهرت أهميتها و توسعت لتشمل أغلب لغات البرمجة النصية Scripting Languages لأنها تفيد كثيراً في هذا النوع من البرمجة التي تحتاج إلى كود سريع و في نفس الوقت قصير و منه هذه اللغات التي تقدم دعم لها الـ PHP و الـ Jscript و Javascript و VBScript و ASP و حتى استعلامات الـ SQL تقدم دعم لها.

قدمت Microsoft مكتبة دعم للـ Regular Expression حتى تستطيع استخدامها بالـ Vbscript و الـ JScript أو بأي لغة أخرى.

أنصح بالأطلاع على Microsoft Windows Script Technologies http://msdn.microsoft.com/scripting .

استخدام الـ Regular Expressions سيزيل عنك الكثير و الكثير من العناء و يجعل الكثير من الأمور التي تبدو معقدة أيسر و أسهل فمثلاً لو أردت عمل برنامج لاستخراج النصوص العربية من أي ملف فسيتطلب ذلك كود طويل و مليء بالأخطاء لكن و بعدة أسطر سهلة يمكنك إنجاز نفس العمل و بالسرعة و الأداء المطلوب.

لننتقل إلى الجانب العملي.

افتح الـ References من Project و أضف الـ Microsoft VBScript Regular Expression 5.5

ملاحظة:بعد إضافة المكتبة للـ References افتح الـ Object Browser من قائمة View أو اضغط F2 ستتمكن عندها من استعراض أغراض و خصائص العنصر RegExp.

أصبحت الآن جاهز لاستخدام هذه الـ Class الخارجية .

Dim myRegExp As RegExp
Dim data As String, itm, res

data = Text1.Text
'ننشء نسخة جديدة من هذا العنصر لنتعامل معها
Set myRegExp = New RegExp
'لتجاهل حالة الأحرف كبيرة أو صغيرة
myRegExp.ignorecase = True 'خاصية تجاهل حالة الأحرف أم لا
myRegExp.Global = True 'ضروري إن كنا نريد استخراج كل النتائج
myRegExp.MultiLine = True 'إن كنا نريد استخدام نصوص متعددة الأسطر
'تحديد نموذج العمل
myRegExp.Pattern = "test" 'خاصية تحديد نموذج البحث
'تنفيذ العملية (استخراج أو استبدال)
Set res = myRegExp.execute(data) 'عملية بحث فستعيد كولكشن بنتائج البحث
'res = myRegExp.Replace(Data, replace_str) 'عملية استبدال فستعيد عدد مرات الاستبدال
'نأخذ الخرج و نتعامل معه....

For Each itm In res
    List1.AddItem itm.Value & " | " & itm.FirstIndex & " | " & itm.Length
Next

بالنسبة للنموذج فبإمكانك استخدام الصيغ القياسية للـ Regular Expressions وهذا شرح مبسط لها:

لو كتبنا بالنموذج أي تسلسل أحرف مثل arabteam و عملنا عملية استبدال فسيقوم باستبدال كل تواجد ل arabteam بالنص.

و هي محرف الهروب escape character أي إذا أردت إدراج محرف محجوز مثل الـ $ أو * أو . أو غيرها فضع الـ قبلها ليتعامل معها كمحرف.

؟ و * و + تدل على أن المحرف أو المجال الذي يسبقها من الممكن تكراره فالـ * تدل على تكرار من 0 حتى عدد غير محدود مثل:

arabteam20*

هنا تتحقق عند arabteam2 و arabteam20 و arabteam200 و arabteam2000 و arabteam20000 و ....

و لو استخدمنا الـ + لدلت على تكرار 1 أو أكثر، مثال:

arabteam20+

هنا يتحقق عند arabteam20 و arabteam200 و .....

بينما تدل الـ ؟ على وجود أو عدم وجود أي إما أن يوجد مرة واحدة أو لا يوجد مثل:

arabteam20?

هنا يتحقق عند الـ arabteam20 و الـ arabteam2 فقط.

طيب إذا أردنا أن نحدد نحن عدد المرات التي من الممكن أن يتكرر المحرف بأن نحدد أقل و أعلى حد مسموح عندها نستخدم{Min,Max} فمثلاً.

arabteam20{0,3}

هنا يتحقق الكود عند تكراره من 0 مرة إلى 3 مرات

arabteam2 و arabteam20 و arabteam200 و arabteam2000

المجالات:

تدل النقطة . على أي حرف فمثلاً:

arabte.m هنا تتحقق عند arabteam و arabtebm و arabteacm و arabtedm و ....

و إذا كنا تحديد المجال المسموح به من المحارف نضعها بين قوسين كبيرين كالتالي و داخله بداية المجال-نهاية المجال:

arabte[a-c]m

المجال يدل على الأحرف المحصورة بين الـa و الـ C أي abc و منه فيتحقق المجال هذا عند: arabteam و arabtebm و arabteacm فقط

و إن لم نضع الـ - في المجال فستدل على تواجد هذا الحرف أو مجموعة الأحرف الموجودة داخل القوسين مثل:

arab[team]2000

يتحقق عند arabteam2000

مثال آخر:

arab[team]?2000

يتحقق عند arabteam2000 و arab2000

الـ | : تدل على (أو) مثلاً:

arab[team|team2000]

تتحقق عند arabteam و arabteam2000.

الـ ^: تدل أشارة ^ على الأستثناء إن وجدت داخل المجال و سنرى وظيفة أخرى لها إن لم توجد داخل المجال، مثال:

arab[^t]eam

هنا تتحقق عند arablead,arabcead .... ما عدا arabteam.

وجود الـ ^ إن لم تكن داخل قوسين كبار يدل على أن الجملة يجب أن تبدأ بكذا و الـ $ تعني أن الجملة يجب أن تنتهي بكذا .مثال:

^arab[.]*

تتحقق على أي جملة تبدأ .....

أمثلة عملية أتمنى أن تفكرو فيها و تفهموها و السؤال إن وجد أي استفسار.

لاستخراج أو البحث عن أرتباطات في نص:

(http://|www.)[a-z0-9/-._?%+;&=]+

لاستخراج الأيميلات من نص أو التحقق من صحة أيميل:

[a-z0-9_-.]+@[a-z0-9_-.]{1,}.[a-z0-9]{2,4}

لاستخراج الأرتباطات من الـ HTML :

.*

لاستخراج نصوص عربية:

[ءrnsأ-ي]{3,}

أتمنى أن تكونو قد استفدتم.

مصادر:

Microsoft Windows Script Technologies:

http://msdn.microsoft.com/scripting

http://msdn.microsoft.com/library/default....egexpsyntax.asp

PHP:

http://www.phpbuilder.com/columns/dario19990616.php3

http://www.phpvillage.com/p.php?page=0&idp=54

#2

احسنت أخي وبارك الله فيك

هذا الموضوع مغلق.

مواضيع مشابهة