انتقل إلى محتوى الدرس
الدرس 146
دورة جافا سكريبت

التعبيرات النمطية RegExp في JavaScriptJavaScript Regular Expressions

أتقن التعبيرات النمطية RegExp في JavaScript من صياغة الأنماط والأعلام وفئات المحارف والمراسي ودوال test وmatchAll إلى الوقاية من بطء التراجع ReDoS.
أقسام الدرس
5
الأمثلة
2
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 5تصفّح المواضيع

يُمثل التعبير النمطي (RegExp) كائناً وصفياً مختصراً يحدد شكل السلسلة النصية المطلوبة؛ فيغنيك عن عشرات الحلقات والشروط المعقدة عند التحقق من صيغة رمز بريدي أو استخراج الوسوم أو إخفاء أرقام البطاقات.

فبدلاً من فحص الحروف يدوياً حرفاً تلو حرف، تصف القاعدة مرة واحدة ليتولى محرك RegExp المدمج مطابقتها بسرعة عالية.

مخطط مكونات التعبير النمطي RegExp: المراسي وفئات المحارف والمكممات والوقاية من بطء ReDoS

تتيح JavaScript طريقتين لإنشاء التعبير النمطي: الصيغة الحرفية بين شرطتين مائلتين /pattern/flags للأنماط الثابتة المعروفة سلفاً، والباني new RegExp(source, flags) عند الحاجة لتكوين النمط ديناميكياً أثناء التشغيل:

العَلَم (Flag)الوظيفة الدقيقةحالة الاستخدام العملية
g (شامل)البحث عن كافة المطابقات بالنص لا الأولى فقطاستخراج كل الوسوم عبر matchAll
i (تجاهل الحالة)مطابقة الحروف الكبيرة والصغيرة دون تفريقالبحث غير الحساس لحالة الأحرف
u (يونيكود)دعم كامل لمحارف Unicode واللغات العالميةمطابقة الحروف العربية والرموز التعبيرية بدقة
m (متعدد الأسطر)جعل ^ و$ يطابقان بداية ونهاية كل سطرفحص سجلات متعددة السطور

تتألف الأنماط المحكمة من ثلاث لبنات متكاملة:

  • فئات المحارف: \d للأرقام 0-9، و\w لمحارف الكلمات الإنجليزية، و\s للمسافات، أو فئة مخصصة مثل [a-z0-9_-].
  • المراسي (Anchors): ^ لبداية النص و$ لنهايته؛ فبدونهما يقبل النمط وجود محارف غريبة قبل الجزء المطابق أو بعده!
  • المكممات (Quantifiers): + لواحد فأكثر، و? للاختياري، والمدى الدقيق {3,16} لتحديد أقل وأقصى طول.
JavaScript
const slugRule = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
const ok = slugRule.test('json-data-types');
const bad = slugRule.test('Bad_Slug!');
document.getElementById('rx-out').textContent =
  'Valid slug: ' + ok + ' | Invalid slug: ' + bad;

اختر الدالة الأنسب بحسب النتيجة التي تحتاجها:

  • regex.test(str) — أسرع فحص منطقي يُرجع true أو false (تجنب وضع العلم /g مع دالة test المتكررة!).
  • Array.from(str.matchAll(/.../g)) — لاستخراج كافة المطابقات ومجموعات الالتقاط المسماة (?<year>\d{4}).
  • str.replace(regex, ...) — لإخفاء البيانات الحساسة أو تنسيق النصوص في سلسلة جديدة.
JavaScript
const logLine = 'Order #4821 on 2026-11-06 — Card 4111-2222-3333-9876';
const dateMatch = /(?<yr>\d{4})-(?<mo>\d{2})-(?<dy>\d{2})/.exec(logLine);
const masked = logLine.replace(/\d{4}-\d{4}-\d{4}-(\d{4})/, '****-****-****-$1');
document.getElementById('m-out').textContent =
  'Year: ' + dateMatch.groups.yr + ' | ' + masked;

تنشأ ثغرة حجب الخدمة بالتعبيرات النمطية (ReDoS) عند كتابة نمط غامض يضم مكممات متداخلة مثل /(a+)+$/ وتمرير نص طويل ينتهي بحرف غير مطابق؛ إذ يجرب المحرك ملايين المسارات التراجعية الأسية قبل إعلان الفشل مما يجمد تبويب المتصفح أو يعطل الخادم تماماً!

احمِ تطبيقاتك من بطء ReDoS بثلاث قواعد صارمة:

  • امنع تداخل المكممات التكرارية مثل (x+)+ واستبدلها بنمط خطي بسيط x+ أو مدى محدد {1,64}.
  • افحص طول المدخلات أولاً (str.length <= 254) قبل تمريرها لأي نمط معقد.
  • لا تمرر نصاً كتبه المستخدم مباشرةً إلى new RegExp(userInput) دون تهريب رموزه الخاصة!
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس التعبيرات النمطية RegExp بصيغتيها الحرفية والديناميكية، والأعلام الأساسية، وفئات المحارف والمراسي والمكممات، ودوال test وmatchAll وreplace، والوقاية من ثغرات التراجع الكارثي ReDoS. الخطوة التالية: انتقل إلى درس «اكتشاف وتصحيح الأخطاء البرمجية في JavaScript» لإتقان أدوات التشخيص وجداول المراقبة ونقاط التوقف.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات3

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 3 مفهومةأول بطاقة، أول خطوة
01 RegExp Anchors (^ and $) مرساتا البداية والنهاية (^ و$)
رمزا تثبيت يضمنان مطابقة النمط لكامل السلسلة النصية من أول حرف (^) حتى آخر حرف ($).
للمراجعة
02 Named Capture Group مجموعة الالتقاط المسماة
صياغة (?<name>...) تحفظ الجزء المطابق باسم واضح داخل الكائن match.groups لقراءة سهلة.
للمراجعة
03 Catastrophic Backtracking (ReDoS) التراجع الكارثي ReDoS
تباطؤ أسي حاد يجمد المتصفح أو الخادم عند فشل نمط يضم مكممات متداخلة غامضة على نص طويل.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 ReDoS ReDoS
Regular Expression Denial of Service
حجب الخدمة عبر التعبيرات النمطية الناتج عن التراجع الأسي في الأنماط المتداخلة غير المحدودة.
للمراجعة
02 UTF UTF
Unicode Transformation Format
ترميز المحارف العالمي الذي يتعامل معه التعبير النمطي بدقة تامة عند تفعيل العلم u.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. استبدل النص الخاطئ في محرر التجربة الأول بالمعرف السليم "dom-nodes-new" وتأكد من تحول النتيجتين إلى true.

  2. اعرض قيمة الشهر dateMatch.groups.mo بجانب السنة في محرر التجربة الثاني للتأكد من عمل المجموعات المسماة.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

لماذا يجب كتابة نمط التحقق من رمز سري رباعي بالصورة /^\d{4}$/ مع المراسي بدلاً من /\d{4}/ بدونها؟

02

أي نمط مما يلي يُعد مثالاً كلاسيكياً خطراً يسبب التراجع الكارثي (ReDoS)؟

03

لماذا يعيد استدعاء rx.test("js") مرتين متتاليتين مع وجود العلم /g القيمة true أولاً ثم false ثانياً؟

04

ما العلم القياسي الذي يجعل المطابقة تتجاهل فرق الحروف الكبيرة والصغيرة؟

05

ما العلم الإلزامي لتفعيل خصائص لغات Unicode القياسية مثل مطابقة الحروف العربية؟

06

عند كتابة النمط كنص داخل new RegExp("\\d+") تجب مضاعفة الشرطة العكسية لأنها تُفسر داخل السلسلة النصية أولاً.

07

أين تُخزن القيم الملتقطة بالمجموعات المسماة مثل (?<year>\d{4}) داخل كائن نتيجة المطابقة؟

08

تمرير نص بحث كتبه الزائر مباشرة إلى new RegExp(userInput) دون تهريب رموزه الخاصة ممارسة آمنة.

09

ماذا يعني المكمم المحدد {3,8} عند وضعه مباشرة بعد الفئة [a-z]؟

10

لا يجوز الاعتماد على التعبيرات النمطية وحدها لتعقيم HTML من ثغرات XSS بل يجب استخدام textContent.