التعبير النمطي (Regular Expression) هو لغة صغيرة تُصف نمط نصي، وتُستخدم للبحث والاستخراج والتبديل. قد يبدو غامضاً في البداية، لكن ثلاثة عناصر فقط تفسر أغلب ما ستكتبه: ما الذي نطابقه، وماذا نحفظ منه، وأين يتوقف. هذا الدليل يبني هذه العناصر عملياً.
أساسيات: الحرف و . والمجموعة
- الحرف العادي يطابق نفسه: cat يطابق كلمة cat حرفاً بحرف.
- النقطة . تطابق أي محرف واحد عدا محرف السطر الجديد.
- الأقواس ( ) تحدّد نطاق التطابق: (ab)+ يطابق ab ثم ab مرة أخرى، ولا يطابق a فقط.
- الرمز | يعني أو: cat|dog يطابق أي منهما.
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
│ │ │ │
│ │ └─ النطاق: الأحرف المسموحة في النطاق الثاني
│ └── كل واحد أو أكثر (+)
└── بداية النص
القاعدة: كل ما يليه + أو * أو ? يمكن تطبيقه على المحرف السابق مباشرة.المكمّلات: كم مرة؟
هذه أهم أداة عملية في Regex. تحدّد عدد مرات تكرار ما قبلها:
| الرمز | المعنى | مثال على abc |
|---|---|---|
| * | صفر أو أكثر | ac, abc, abbbc |
| + | واحد أو أكثر | abc, abbbc |
| ? | صفر أو واحد | ac, abc |
| {3} | بالضبط 3 | abc |
| {2,} | اثنان أو أكثر | abbc, abbbc |
^\+?[0-9]{1,3}-?[0-9]{7,10}$
↑ │ │ │ │
│ │ │ │ └─ 7 إلى 10 أرقام
│ │ │ └─ شرطة اختيارية
│ │ └─ أول رقم أو أرقام
│ └─ إشارة + اختيارية
└─ بداية النصالمجموعات: التقط ما يهمّك
الأقواس لا تكتفي بتحديد النطاق، بل تجعل المحرّك يحفظ ما بداخلها. هذا هو الفرق بين استخراج البيانات ومجرد التحقق من وجودها:
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: يأخذ أطول تطابق ممكن. لإجباره على أقل عدد ممكن، أضف ? بعده. هذا الفرق جوهري عند الاستخراج:
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) للفصل |
// خطأ: catcatcat يمرّ لأن أي محرف يطابق . ثم cat
/text.*cat/.test("textcatcatcat"); // true ← خطأ
// صحيح: حدّ بين الكلمات
/text\bcat\b/.test("textcatcatcat"); // falseمتى تستخدم Regex ومتى لا
- استخدمها للتحقق من تنسيق: بريد، هاتف، رقم بطاقة، معرّف.
- استخدمها لاستخراج أنماط من نص متجانس: التواريخ، المعرّفات، الوسوم.
- لا تستخدمها لتحليل HTML أو XML. في كل لغات الويب الآن محلّلاتLexical (DOM) أكثر أماناً وأسرع.
- لا تستخدمها لنصNatural غير منظّم؛ النمط بديع لكن صعب القراءة والصيانة.