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

سلسلة تعلم Regular Expressions

مغلق
بدأه الشهاب الحارق في 2 أبريل 2005 · 2 رد · 1,483 مشاهدة · في Microsoft Visual Basic.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 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>

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

Using BackReferences.zip

في المثال يتضح المقال

#2

جزاكم الله خيراً..

سؤال:

ما الفارق بين

.*?

و

*؟

حسب فهمي المفروض انهما متماثلين تماماً لكن النتائج مختلفة ، فلماذا؟؟

الاجوبة مرفقة..

السؤال السادس لم افهمه .. ماذا تقصد بالمجموعة الثالثة؟؟

answers.txt

تم تعديل هذه المشاركة بواسطة undo في 3 أبريل 2005 في 14:04

اقتباس
الـ VB هى الأساس ... بتبرمج بيها بالاحساس

ولا سيمي كولن ولا أقواس ... وتعلمها سهل لكل الناس

راكب فيها موتور نفاث ... دي سريعه جدا وباخلاص

الـ VB هى التراث ... للذكور والايناث :D

الـ VB لغة عريقه ... حتى اسأل Anwarica

من ديوان الشاعر السي شاربي "معتز شمس"
#3

السلام عليكم

حياك الله أخي بالنسبة للمقارنة التي عرضتها فهي كالتالي

الأولي

.*?

وكما تعلم أنها أداة تعرف بـ Lazy Technique مثلها مثل الـصيغة التالية

.+?

فهي كذلك Lazy Tec وحذف علامة الإستفهام ستكون من نوع Greedy وهذا تكلمنا عنه في سياق الدرس

أما الصيغة التالية

*؟

فهذه مختلفة تماماً السبب بسيط جداً علامة الإستفهام اليمينية (ليس حزب اليمين المتطرف) B)

هنا ليست أداة من أدوات Regex و إنما Unicode Character و تحليل الصيغة يكون بالبحث عن قيمة ما رقم حرف رمز

تتبعه علامة الإستفهام اليمينية أو العربية و العبرية و تطابقها القيمة التالية مثلاً

1؟

فهما اي علامتي الإستفهام ليست متشابهتان بل مختلفتان تماماً الأولى أداة والثانية حرف أو رمز.

بالنسبة لـ ماذا تقصد بالمجموعة الثالثة؟؟

أقصد مجموعة () تحتل المرتبة الثالثة من حيث الـ Index مكانها في الصيغة اي هنالك الأولى و الثانية ثم الثالثة و نريد أن نستخدم

الـ Caption الموجود في المجموعة الثالثة فكيف نناديها ؟

كل الأجوابة التي جوابت عليها صحيحة بإستثناء السؤال الأخير صحيح من حيث التركيبة وخاطئ من حيث المعطيات أو الناتج

راجع السؤال السادس بتمعن المطلوب هو جمع كم وسم من <a> متوفر في وثيقة XML بالتوفيق أخي العزيز .

في المثال يتضح المقال

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

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