السلام عليكم
الدرس الثامن : 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 str1 As String = "<[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 str5 As String = "(\s)Regex"
تحليل الـ Pattren كالتالي
أبحث عن فراغ متبوع بالكلمة Regex .
ثم نكتب الوظيفة التالية
Public Function FindAndReplace(ByVal value As String, ByVal Replacment As String) As String Try Dim rx As New Regex(str5) value = rx.Replace(value, Replacement) Return value Catch ex As Exception Throw ex End Try End Function
البحث في النص السابق ذكرة وهو قيم HTML tags ثم إستبداله بالممرر Replacement
ثم نستخدمها بهذا الشكل عن طريق الضغط على الزر
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click Me.txt3.Text = FindAndReplace(txt3.Text, "$1") End Sub
تقنية البحث و الإستبدال تعتمد على المجموعات كذلك , بحيث تقوم بحفظ ما تطابق في المجموعة ثم إستبداله
بالقيمة التي نُعينُها فمثلاً في هذا المثال إذا تطابقة المسافة مع الكلمة 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>
وفقكم الله ....... السلام عليكم