16-09-20, 01:58 PM
السلام عليكم اخواني الكرام اسمحولي ان ادلي بدلوي في هذا الموضوع
الحقيقة الموضوع مهم فعلا ومثير للاهتمام لكل من يفكر به فعلا
حلي عبارة عن خليط من ال Regex وال Linq
لو فكرنا في النص المطلوب ايجاده باحتمالاته : حَمد ، حُمِدَ ، حَمْدْ ، حمد
المشترك بينهم هو انهم مكونين من الحروف المطلوب البحث عنها : حمد ، وبعد كل حرف حركة تشكيل او اكثر
ح بعدها احد حروف التشكيل
م بعدها احد حروف التشكيل
د بعدها احد حروف التشكيل
بحثت فوجدت حروف التشكيل تقع في المدى [\u064B-\u0652]
يصبح تعبير Regex الذي يمثل عملية البحث هذه :
ح[\u064B-\u0652]*
م[\u064B-\u0652]*
د[\u064B-\u0652]*
الحرف ثم مدى التشكيل [\u064B-\u0652] ثم * للدلالة على ان التشكيل اختيارى ويمكن تكراره
في الحقيقة هذا فعلا كل ما يتطلبه ايجاد "حمد" داخل التشكيل واضافتهم لليست بوكس :
ولكن سأخد خطوة للوراء لتعميم العملية على اي كلمة ،
الان وصلنا الى انه يجب علينا ان نضع بعد كل حرف [\u064B-\u0652]* ونستخدمه ك Regex ونحصل على النتائج ، لفعل ذلك ببساطة :
نعرف متغير عام :
ثم لملئ الليست بوكس
طيب حصلنا على النتائج كيف نغير اللون ؟
نتيجة Regex.Matches تكون عبارة عن كوليكشن من نوع Match نتيجة البحث
الفئة Match تحتوي على خصائص مفيدة مثل Index و Length
يكون كود تغيير اللون ببساطة :
النتيجة :
ولاني احب Linq كثير ، ايضا هذه طريقة ايجاد تعبير البحث المناسب باستخدام Linq :
اذا لم تكن مهتم ب Linq لا تشغل بالك ابدا باخر كود ، الطريقة الاولى تعمل بكفائة عالية جدا
ربما اضع الطريقة في موضوع منفصل للافادة
المصادر :
https://stackoverflow.com/questions/2962...n-matching
https://stackoverflow.com/questions/5224...ly/7193622
https://stackoverflow.com/questions/3839...s-in-order
https://stackoverflow.com/questions/3849...in-c-sharp
الحقيقة الموضوع مهم فعلا ومثير للاهتمام لكل من يفكر به فعلا
حلي عبارة عن خليط من ال Regex وال Linq
لو فكرنا في النص المطلوب ايجاده باحتمالاته : حَمد ، حُمِدَ ، حَمْدْ ، حمد
المشترك بينهم هو انهم مكونين من الحروف المطلوب البحث عنها : حمد ، وبعد كل حرف حركة تشكيل او اكثر
ح بعدها احد حروف التشكيل
م بعدها احد حروف التشكيل
د بعدها احد حروف التشكيل
بحثت فوجدت حروف التشكيل تقع في المدى [\u064B-\u0652]
يصبح تعبير Regex الذي يمثل عملية البحث هذه :
ح[\u064B-\u0652]*
م[\u064B-\u0652]*
د[\u064B-\u0652]*
الحرف ثم مدى التشكيل [\u064B-\u0652] ثم * للدلالة على ان التشكيل اختيارى ويمكن تكراره
في الحقيقة هذا فعلا كل ما يتطلبه ايجاد "حمد" داخل التشكيل واضافتهم لليست بوكس :
كود :
Dim matches = Regex.Matches(RichTextBox1.Text, "ح[\u064B-\u0652]*م[\u064B-\u0652]*د[\u064B-\u0652]*")
For Each m As Match In matches
ListBox1.Items.Add(m.Value)
Nextولكن سأخد خطوة للوراء لتعميم العملية على اي كلمة ،
الان وصلنا الى انه يجب علينا ان نضع بعد كل حرف [\u064B-\u0652]* ونستخدمه ك Regex ونحصل على النتائج ، لفعل ذلك ببساطة :
نعرف متغير عام :
كود :
Dim matches As MatchCollectionثم لملئ الليست بوكس
كود :
Dim word As String = TextBox1.Text
Dim expression As String = ""
For Each l In word
expression &= l & "[\u064B-\u0652]*"
Next
matches = Regex.Matches(RichTextBox1.Text, expression)
For Each m As Match In matches
ListBox1.Items.Add(m.Value)
Nextطيب حصلنا على النتائج كيف نغير اللون ؟
نتيجة Regex.Matches تكون عبارة عن كوليكشن من نوع Match نتيجة البحث
الفئة Match تحتوي على خصائص مفيدة مثل Index و Length
يكون كود تغيير اللون ببساطة :
كود :
RichTextBox1.SelectAll()
RichTextBox1.SelectionColor = Color.Black
For Each m As Match In matches
RichTextBox1.Select(m.Index, m.Length)
RichTextBox1.SelectionColor = Color.Red
Nextولاني احب Linq كثير ، ايضا هذه طريقة ايجاد تعبير البحث المناسب باستخدام Linq :
كود :
Dim word As String = TextBox1.Text
Dim expression = word.
Select(Function(x) x + "[\u064B-\u0652]*").
Aggregate(Function(x, y) x + y)
matches = Regex.Matches(RichTextBox1.Text, expression)
ListBox1.DisplayMember = "Value"
ListBox1.DataSource = matches.Cast(Of Match).ToListاذا لم تكن مهتم ب Linq لا تشغل بالك ابدا باخر كود ، الطريقة الاولى تعمل بكفائة عالية جدا
ربما اضع الطريقة في موضوع منفصل للافادة
المصادر :
https://stackoverflow.com/questions/2962...n-matching
https://stackoverflow.com/questions/5224...ly/7193622
https://stackoverflow.com/questions/3839...s-in-order
https://stackoverflow.com/questions/3849...in-c-sharp

