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

سلسلة تعلم Regular Expressions

مغلق
بدأه Ahmed H. Alawady في 9 أكتوبر 2005 · 0 رد · 842 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1

نقلا عن الأخ الغملاسي : الموضوع

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

السلام عليكم

الدرس الثامن : Back Reference العودة للمرجع

مدة الدرس 5 دقائق

أداة الـ Back Reference هي

\N

حيثُ N رقم يمثل مكان المجموعة مثلاً

\1

يعني ويقصد المجموعة الأولى

ما الفائدة من الـ Back Reference هو التحقق من تطابق مقطع معين وفقاً لتطابقة في المقطع السابق محدد بمجموعة

مثالُ ذلك أننا نريد أن نتحقق من الوسم HTML tag

و بالتحديد من وسم حجم خط العنوان Header font size <H1>what</H1> شاهد المثال

<H1>Welcome To Regex</H1>
<H2>Well in fact</H2>
<H3>EveryThing Going Well Until Now</H3>
<H4>Can you Notice This Mistake BackReference Cans</H3>

تلاحظ أن هنالك خطأ في الوسم الثالث حيثُ يبدأ بالرقم أربعة وينتهي بالرقم ثلاثة .

الآن دعنا نستخدم التحقق بدون أداة الـ Back Reference بهذا الشكل

const string str1 = "<[hH]([1-6])>.*?</[hH][1-6]>";

تحليل الـ pattern

في البداية البحث عن أصغر من (>) ثم حرف الـ H أو h ثم رقم من 1 إلى 6

ثم إغلاق الوسم بـ (<) ثم قيمة ما عن طريق النقطة . ثم متبوعه بلا شيء أو أكثر مع علامة الإستفهام

والتي تعرف هنا بتقنية القنوع أو الكسول Lazy و هذا يعني أن حذف علامة الإستفهام سيكون

الـ pattern من نوع Greedy وهو الطماع أو الجشع بحيث لن يقف التطابق عند وسم الإغلاق بل

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

الناتج سيكون There are 4 HTML Tags Founded

الان سنكتب الـ pattern مع الـ Back Reference بهذا الشكل

Const str2 As String = "<[hH]([1-6])>.*?</[hH]\1>"

والناتج سيكون مختلف بلا شك و بهذا الشكل There are 3 HTML Tags Founded

مالذي حدث بالضبط

أولاً تلاحظ المجموعة الأولى وهي

([1-6])

وتلاحظ الـ Back Reference وهو

\1

وهو بالتحديد بعد الـ [hH] المقصد أن نتحقق من وسم الإغلاق

Closing Tag ثم أتبعناه بالـ \1 بالقيمة التي تم التحقق منها لوسم البدء وهو Starting Tag فإن كان مثلاً <H1>

فسيتحقق من وسم الإغلاق هل هو كذلك </H1> فإن لم يكن كذلك لن يتم التطابق .

السبب أن العودة للمرجع ينظر في المجموعة التي طابقت وسم البدء وبالتحديد بأي رقم تم التطابق .

كذلك يمكننا العودة للمرجع عن طريق اسم المجموعة يتم تسميت المجموعات في الـ VB.NET بطريقتين هما كالتالي

الطريقة الأولى :

?<Nums>

أما الطريقة الثانية فتكون كالتالي

?'Nums'

شاهد الطريقتين في المثال المرفق .

ملاحظة الـعودة للمرجع لا يعمل إلى مع المجموعات فقط ودونها يكون عديم الفائدة.

و سنختم الدرس بتقنية البحث و الإستبدال Find and Replace

و ذلك عن طريق الأداة $ مثلاً أبحث عن Regex و إستبدلها بفراغ بهذا الشكل

const string str5 = "(\\s)Regex";

تحليل الـ Pattren كالتالي

أبحث عن فراغ متبوع بالكلمة Regex .

ثم نكتب الوظيفة التالية

public string FindAndReplace(string value, string Replacment) 
{ 
 try { 
   Regex rx = new Regex(str5); 
   value = rx.Replace(value, Replacement); 
   return value; 
 } catch (Exception ex) { 
   throw ex; 
 } 
}

البحث في النص السابق ذكرة وهو قيم HTML tags ثم إستبداله بالممرر Replacement

ثم نستخدمها بهذا الشكل عن طريق الضغط على الزر

private void Button5_Click(object sender, System.EventArgs e) 
{ 
 this.txt3.Text = FindAndReplace(txt3.Text, "$1"); 
}

تقنية البحث و الإستبدال تعتمد على المجموعات كذلك , بحيث تقوم بحفظ ما تطابق في المجموعة ثم إستبداله

بالقيمة التي نُعينُها فمثلاً في هذا المثال إذا تطابقة المسافة مع الكلمة Regex فإن المجموعة

ستحتفظ بقيمة المسافة وعند مناداتها بهذا الشكل $1 سيستبدل ما تطابق بالقيمة المطابقة وهي

المسافة في مثالنا هذا لأننا في المجموعة كتبنا التالي (\s) وهذا يعني أننا نبحث عن مسافة فقط .

فهي عملية Caption البحث عن المسافة مع الكلمة Regex

ثم إستبدالها بالمسافة أو ما تطابق في المجموعة الأولى (\s) بمناداتها بالـ $1

أي عملية Caption من المجموعة و Insert في ما تطابق عن طريق الـ pattren لا أكثر .

بلا شك أن هنالك أدوات في الـ VB.NET تمكننا من العمل بسهولة و مرونه أكثر لكن الأدوات

ليس هذا مكانها الأن وهي إن شاء الله في الدرس الأخير من هذه السلسلة المتواضعه .

أسئلة الدرس الثامن

صح أم خطأ

السؤال الأول : للعودة للمجموعة الثانية نكتب \1

السؤال الثاني : يكتب اسم المجموعة بهذا الشكل !<myGroup>

السؤال الثالث : يتم العودة لإسم المجموعة بهذا الشكل "myGroup"

السؤال الرابع : يتم كتابة اسم المجموعة قبل قوس الإغلاق ( ؟

السؤال الخامس : إذا كنت تبحث عن وسم تكبير الخط Bold Tag فأنت تحتاج تقنية العودة للمرجع ؟

السؤال السادس : لإستبدال ما تم تطابقة في المجموعة الثالثة يكون بهذا الشكل $2

…………………………………………………….

السؤال السابع : أكتب صيغة تتحقق من وسم XML tag و بالتحديد الوسم <a1>

إستخدم العودة للمرجع Back Reference الناتج سيكون تطابقين فقط .

هذهِ هي القيم التي ستكتب صيغة تبحث عن وسم XML tag .

<q1>What is Your Name ?

<a1>Ali</a3>

<a2>Saif</a2>

<a3>Nasser</a3>

<a4>Saeed</a3>

</q1>

وفقكم الله ....... السلام عليكم

الملف المرفق

تم تعديل هذه المشاركة بواسطة Ahmed H. Alawady في 9 أكتوبر 2005 في 18:21

Name : Ahmed H. Alawady

Web Site : Alawady.info

Email : alawady_ahmed@hotmail.com

Tel : +2 012 345 6808

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

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