تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[كود] تصحيح او تعديل كود البحث في نص مشكل
#6
السلام عليكم اخواني الكرام اسمحولي ان ادلي بدلوي في هذا الموضوع

الحقيقة الموضوع مهم فعلا ومثير للاهتمام لكل من يفكر به فعلا  Big Grin 

حلي عبارة عن خليط من ال 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


الملفات المرفقة
.zip   statistic_coran.zip (الحجم : 74.45 ك ب / التحميلات : 23)
الرد }}}


الردود في هذا الموضوع
RE: تصحيح او تعديل كود البحث في نص مشكل - بواسطة Anas Mahmoud - 16-09-20, 01:58 PM


التنقل السريع :


يقوم بقرائة الموضوع: