التعبير النمطي (Regular Expression) هو لغة صغيرة تُصف نمط نصي، وتُستخدم للبحث والاستخراج والتبديل. قد يبدو غامضاً في البداية، لكن ثلاثة عناصر فقط تفسر أغلب ما ستكتبه: ما الذي نطابقه، وماذا نحفظ منه، وأين يتوقف. هذا الدليل يبني هذه العناصر عملياً.

أساسيات: الحرف و . والمجموعة

  • الحرف العادي يطابق نفسه: cat يطابق كلمة cat حرفاً بحرف.
  • النقطة . تطابق أي محرف واحد عدا محرف السطر الجديد.
  • الأقواس ( ) تحدّد نطاق التطابق: (ab)+ يطابق ab ثم ab مرة أخرى، ولا يطابق a فقط.
  • الرمز | يعني أو: cat|dog يطابق أي منهما.
مثال أولtext
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
│ │  │                                    │
│ │  └─ النطاق: الأحرف المسموحة في النطاق الثاني
│ └── كل واحد أو أكثر (+)
└── بداية النص

القاعدة: كل ما يليه + أو * أو ? يمكن تطبيقه على المحرف السابق مباشرة.

المكمّلات: كم مرة؟

هذه أهم أداة عملية في Regex. تحدّد عدد مرات تكرار ما قبلها:

الرمزالمعنىمثال على abc
*صفر أو أكثرac, abc, abbbc
+واحد أو أكثرabc, abbbc
?صفر أو واحدac, abc
{3}بالضبط 3abc
{2,}اثنان أو أكثرabbc, abbbc
مثال: رقم هاتفtext
^\+?[0-9]{1,3}-?[0-9]{7,10}$
↑  │     │        │        │
│  │     │        │        └─ 7 إلى 10 أرقام
│  │     │        └─ شرطة اختيارية
│  │     └─ أول رقم أو أرقام
│  └─ إشارة + اختيارية
└─ بداية النص

المجموعات: التقط ما يهمّك

الأقواس لا تكتفي بتحديد النطاق، بل تجعل المحرّك يحفظ ما بداخلها. هذا هو الفرق بين استخراج البيانات ومجرد التحقق من وجودها:

استخراج السنة والشهر واليومjavascript
const date = "2026-09-29";

// مع.groups تستخرج ما في كل مجموعة
const m = date.match(/(\d{4})-(\d{2})-(\d{2})/);
console.log(m[1], m[2], m[3]);  // 2026 09 29

// المجموعات المسمّاة أوضح عند كثرة المجموعات
const named = date.match(/(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})/);
console.log(named.groups.y);     // 2026

ال(jsoneة) والكسول: أكثر مصدر لأخطاء غير متوقعة

المكمّل *贪婪 في Photoshop: يأخذ أطول تطابق ممكن. لإجباره على أقل عدد ممكن، أضف ? بعده. هذا الفرق جوهري عند الاستخراج:

مقارنة عمليةjavascript
const html = "<b>first</b> and <b>second</b>";

// greedy: يأخذ أطول نص بين أول < وآخر >
console.log(html.match(/<b>(.*)<\/b>/)[1]);
// → "first</b> and <b>second"

// lazy: يتوقف عند أول <
console.log(html.match(/<b>(.*?)<\/b>/)[1]);
// → "first"

أخطاء شائعة

الخطأما يحدثالصحيح
نقطتان . في النمطيطابق أي شيء حرفياًاستخدم .? أو اجعلها اختيارية
\w في نص عربيلا يطابق الحروف العربيةأضف فئات النصوص العربية
نمط بلا ^ و $يطابق جزئياً في أي موضعثبّت بـ ^ و $ إن أردت مطابقة كاملة
catcatcat في فرعيتكرر دون حدوداستخدم (?:^|\s) للفصل
الخطأ: . يتكرر بلا حدودjavascript
// خطأ: catcatcat يمرّ لأن أي محرف يطابق . ثم cat
/text.*cat/.test("textcatcatcat");   // true ← خطأ

// صحيح: حدّ بين الكلمات
/text\bcat\b/.test("textcatcatcat"); // false

متى تستخدم Regex ومتى لا

  • استخدمها للتحقق من تنسيق: بريد، هاتف، رقم بطاقة، معرّف.
  • استخدمها لاستخراج أنماط من نص متجانس: التواريخ، المعرّفات، الوسوم.
  • لا تستخدمها لتحليل HTML أو XML. في كل لغات الويب الآن محلّلاتLexical (DOM) أكثر أماناً وأسرع.
  • لا تستخدمها لنصNatural غير منظّم؛ النمط بديع لكن صعب القراءة والصيانة.