آرین سليمان زاده
  • الرئيسية
  • المدونة
  • البودكاست
  • الفيديوهات
  • تواصل
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
اللوحة•تواصل سريع

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

احجز موعداً

أرسل رسالة قصيرة — سأرد في أقرب وقت ممكن.

LinkedInاستجابة سريعة
الرئيسية/المقالات/ما هي Regular Expression Matching؟ شرح Regex باستخدام Dynamic Programming
Algorithmsمقال

ما هي Regular Expression Matching؟ شرح Regex باستخدام Dynamic Programming

مسألة Regular Expression Matching تطابق String بالكامل مع Pattern يحتوي على . و* باستخدام Dynamic Programming أو Memoization، وهي من مسائل الخوارزميات الكلاسيكية.

١٩ أغسطس ٢٠٢٦7 دقيقة قراءة0 المشاهدات
#Algorithms#Regex#Regular Expression#Dynamic Programming#String Algorithms#TypeScript

Arian Soleimanzadeh

Software Engineer & Researcher

جدول Dynamic Programming لمطابقة Regex يحتوي على dot وstar مع String

Arian Soleimanzadeh

ذكاء اصطناعي · برمجة · منتج

بحث + هندسة
في هذه الصفحة
معنى Dotمعنى Starلماذا Dynamic Programming؟تعريف DPالحرف العادي أو DotStarTypeScriptالتعقيدRegex مقابل Wildcardأهمية .*Full Matchالاستخدام العمليسؤال مقابلاتالأخطاء الشائعةالخلاصة

في النسخة الخوارزمية الكلاسيكية من Regular Expression Matching نملك String وPattern، ويدعم Pattern عاملين خاصين:

.  → أي حرف واحد
*  → صفر أو أكثر من العنصر السابق

مثلاً:

String: aa
Pattern: a*

النتيجة true لأن a* يمكن أن تمثل حرفي a.

معنى Dot

. يطابق حرفاً واحداً مهما كانت قيمته.

c.t

يمكن أن يطابق cat وcut وc9t.

معنى Star

* يعتمد على العنصر السابق.

a*

يمكن أن يطابق:

""
a
aa
aaa

لماذا Dynamic Programming؟

وجود * يعني أننا نملك عدة احتمالات: استخدام العنصر السابق صفر مرة أو مرة أو عدة مرات.

وهذه الفروع تؤدي إلى Subproblems متكررة، لذلك Dynamic Programming أو Memoization مناسبة جداً.

تعريف DP

dp[i][j]

يعني هل أول i أحرف من String تطابق أول j أحرف من Pattern بالكامل.

الحالة الأساسية:

dp[0][0] = true

ويمكن لـ Pattern مثل:

a*b*c*

أن يطابق String فارغاً لأن كل x* يمكن استخدامه صفر مرة.

الحرف العادي أو Dot

إذا كان الحرفان متساويين أو كان Pattern يحتوي .:

dp[i][j] = dp[i - 1][j - 1]

Star

يمكن أولاً تجاهل العنصر السابق مع *:

dp[i][j] = dp[i][j - 2]

وإذا كان العنصر السابق يطابق الحرف الحالي:

dp[i][j] = dp[i][j] || dp[i - 1][j]

لأن * يمكن أن يستهلك المزيد من الأحرف.

TypeScript

function isRegexMatch(s: string, p: string): boolean {
  const dp = Array.from(
    { length: s.length + 1 },
    () => new Array(p.length + 1).fill(false)
  );

  dp[0][0] = true;

  for (let j = 2; j <= p.length; j++) {
    if (p[j - 1] === '*') {
      dp[0][j] = dp[0][j - 2];
    }
  }

  for (let i = 1; i <= s.length; i++) {
    for (let j = 1; j <= p.length; j++) {
      if (
        p[j - 1] === '.' ||
        p[j - 1] === s[i - 1]
      ) {
        dp[i][j] = dp[i - 1][j - 1];
      } else if (p[j - 1] === '*') {
        dp[i][j] = dp[i][j - 2];

        if (
          p[j - 2] === '.' ||
          p[j - 2] === s[i - 1]
        ) {
          dp[i][j] =
            dp[i][j] || dp[i - 1][j];
        }
      }
    }
  }

  return dp[s.length][p.length];
}

التعقيد

Time Complexity: O(n × m)
Space Complexity: O(n × m)

Regex مقابل Wildcard

في هذا النوع من Regex:

. → أي حرف واحد
* → تكرار العنصر السابق

أما Wildcard Matching فعادة يستخدم:

? → أي حرف واحد
* → أي سلسلة من الأحرف

لذلك معنى * مختلف تماماً.

أهمية .*

. يطابق أي حرف و* يسمح بتكراره، ولذلك:

.*

يمكن أن يطابق أي Sequence تقريباً.

Full Match

المطلوب هو مطابقة String بالكامل.

hello
ell

لا تعتبر Match في هذه المسألة رغم وجود ell داخل String.

الاستخدام العملي

Regex الحقيقي يستخدم في:

  • Validation
  • Search
  • Log Filtering
  • Data Processing
  • Text Extraction

لكن في التطبيقات العملية نستخدم Regex Engine الجاهز للغة بدلاً من إعادة بناء هذه الخوارزمية.

سؤال مقابلات

المهم شرح حالتي *:

0 occurrence

و:

1 or more occurrences

إضافة إلى Initialization للـ Empty String.

الأخطاء الشائعة

  • اعتبار * مستقلة عن الحرف السابق.
  • اعتبارها صفر أو مرة واحدة فقط.
  • نسيان Pattern الذي يمكنه مطابقة String فارغ.
  • قبول Partial Match بدلاً من Full Match.

الخلاصة

Regular Expression Matching مثال ممتاز على تحويل Branching Logic إلى Dynamic Programming.

.  → any one character
x* → zero or more x

والحل القياسي يعمل في زمن O(n × m).

في هذه الصفحة
معنى Dotمعنى Starلماذا Dynamic Programming؟تعريف DPالحرف العادي أو DotStarTypeScriptالتعقيدRegex مقابل Wildcardأهمية .*Full Matchالاستخدام العمليسؤال مقابلاتالأخطاء الشائعةالخلاصة

تفاصيل المقال

بيانات النشر ووقت القراءة وعدد المشاهدات.

تاريخ النشر

١٩ أغسطس ٢٠٢٦

آخر تحديث

١٩ أغسطس ٢٠٢٦

وقت القراءة

7 دقيقة قراءة

المشاهدات

0

الكاتب

Arian Soleimanzadeh

المقال السابق

ما هي خوارزمية Rabin–Karp؟ البحث في النصوص باستخدام Rolling Hash

المقال التالي

ما الفرق بين B2B CRM وB2C CRM؟ من عملية المبيعات إلى بنية البرمجيات

لنبنِ شيئاً نظيفاً، سريعاً، وجميلاً.

تواصل سريع للتعاون، أو الاستشارة، أو العمل على المنتجات.

تواصل سريعراسلني عبر البريد
آرین سليمان زاده

معرض أعمال شخصي يركز على هندسة الويب الحديثة، وأنظمة الواجهات، ومنتجات الذكاء الاصطناعي العملية — كود نظيف، وتصميم نقي.

روابط سريعة

  • نبذة
  • المدونة
  • المشاريع
  • تواصل

تواصل

  • info@ariansoleimanzadeh.site
  • soleimanzadeh.a.work@gmail.com

التوفر: أيام الأسبوع

عادةً يتم الرد خلال 24 ساعة.

النشرة البريدية

احصل على تحديثات حول المقالات، والمشاريع، والإصدارات الجديدة.

© 2026 ariansoleimanzadeh.site — جميع الحقوق محفوظة.

لينكدإن