الرئيسية › Blog › دليل حل مشاكل Regex
أدوات المطورين

لماذا لا تتطابق التعبيرات النمطية (Regex)؟ الأعلام، فواصل الأسطر، ومحارف الهروب

تاريخ النشر: 17 أكتوبر 2026 • آخر تحديث: 17 أكتوبر 2026 • إعداد: فريق هندسة GoToolstack • تم الاختبار باستخدام أداة فحص Regex من GoToolstack
اختبر تعبيرك النمطي وافحصه مباشرة: إبراز فوري للتطابقات، تفصيل مجموعات الالتقاط، وحماية تلقائية من التعليق داخل المتصفح.
فتح أداة فحص Regex
جدول المحتويات
  1. التشخيص المباشر: لماذا يفشل تعبير نمطي سليم في المطابقة؟
  2. الأعلام الأساسية: g و i و m و s (لا تخلط بين m و s)
  3. المحددات الجشعة (.*) مقابل الكسولة (.*?)
  4. محارف الهروب ومصيدة الخط المائل العكسي (السياق الحرفي مقابل فئات المحارف)
  5. أمثلة عملية معتمدة على محرك GoToolstack
  6. فروق المحركات والوقاية من هجمات ReDoS
  7. أدوات GoToolstack للمطورين
  8. المراجع التقنية والمعايير الرسمية

1. التشخيص المباشر: لماذا يفشل تعبير نمطي سليم في المطابقة؟

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

قبل إعادة صياغة النمط، تحقق من آليات التنفيذ الأساسية التالية بالترتيب:

2. الأعلام الأساسية: g و i و m و s (لا تخلط بين m و s)

تحدد الأعلام سلوك المحرك: g يجلب كافة التطابقات؛ i يتجاهل حالة الأحرف؛ m يفعّل محددات البداية والنهاية لكل سطر؛ s يسمح للنقطة بتجاوز فواصل الأسطر.

محرك التعبيرات النمطية (Regex): آليات الأعلام ومطابقة علامات البداية والنهاية
شكل 1: مقارنة سلوك علامات الارتساء: حدود الإدخال المفردة مقابل وضع الأسطر المتعددة (/m).
  • g (شامل): مواصلة البحث عبر النص بأكمله بدلاً من التوقف عند أول تطابق.
  • i (تجاهل حالة الأحرف): إزالة الحساسية بين الحروف الكبيرة والصغيرة.
  • m (متعدد الأسطر): جعل ^ و $ يطابقان بداية ونهاية كل سطر مستقل.
  • s (dotAll): السماح للرمز (.) بمطابقة محارف السطر الجديد (\n, \r).

فارق تقني حاسم: علم تعدد الأسطر (m) لا يسمح للرمز (.) بتجاوز الأسطر الجديدة إطلاقاً! وفي المقابل فإن علم dotAll (s) لا يجعل ^ و $ يطابقان بدايات ونهايات الأسطر الفردية. الخلط بينهما هو السبب الأول لفشل الاستخراج.

3. المحددات الجشعة (.*) مقابل الكسولة (.*?)

بشكل افتراضي، تكون المحددات الكمية جشعة: فهي تستهلك أكبر قدر ممكن من المحارف قبل الرجوع للخلف.

عند استخراج وسوم HTML من: <div>الأول</div><div>الثاني</div>

النمط الجشع <div>.*</div>: يبتلع النص من أول وسم حتى آخر وسم إغلاق في تطابق هائل واحد.

النمط الكسول <div>.*?</div>: تجعل علامة الاستفهام المُحدِّد الكمي كسولاً (lazy)، ليتوقف عند أول وسم إغلاق (<div>الأول</div>). ومع ذلك، لاستخراج كلا التطابقين المستقلين من النص، يجب تضمين العلم العام (g) (/<div>.*?</div>/g). بدون العلم g، يتوقف المحرك فوراً بعد العثور على التطابق الأول.

4. محارف الهروب ومصيدة الخط المائل العكسي (السياق الحرفي مقابل فئات المحارف)

تحتجز التعبيرات النمطية محارف محجوزة دلالياً: \ ^ $ . | ? * + ( ) [ { } ]. تختلف قواعد الهروب باختلاف السياق:

  • خارج فئات المحارف: يلزم إفلات كافة المحارف التركيبية بالشرطة المائلة العكسية (مثل \. و \$) لمطابقتها كرموز حرفية.
  • داخل فئات المحارف ([...]): تفقد معظم المحارف الخاصة وظيفتها وتطابق حرفياً (مثل [.] يطابق النقطة و [*] يطابق النجمة). تحتفظ المحارف ^ (النفي في البداية)، - (المجال)، ] (إنهاء الفئة) و \ (الهروب) فقط بوظائف خاصة.

في كود جافاسكريبت، ميّز بوضوح بين النمط الحرفي والمنشئ النصي:

// 1. Regex Literal (single backslash required)
const reLiteral = /^\d+\.\d+$/;

// 2. String Constructor (double backslash mandatory)
const reConstructor = new RegExp("^\\d+\\.\\d+$");

5. أمثلة عملية معتمدة على محرك GoToolstack

تم فحص كافة الأنماط التالية على محرك ECMAScript بمدخلات حقيقية ونتائج مطابقة مؤكدة:

السيناريو والمدخلات النمط والأعلام التطابق المعتمد المتوقع
ERROR 404 /api\nINFO 200 /home\nERROR 500 /db /^ERROR\s+(\d+)/gm ERROR 404, ERROR 500
Total cost: $49.99 USD /\$(\d+\.\d{2})/ $49.99
/* Multi-line
  comment */
/\/\*.*?\*\//s /* Multi-line
  comment */

6. فروق المحركات والوقاية من هجمات ReDoS

يعمل فاحص GoToolstack داخل محرك المتصفح المحلي. تذكر الفروق التالية مقارنة بـ Python أو PCRE:

  • المطابقة الخلفية (Lookbehind): مدعومة في ES2018+ مثل (?<=...) ولكنها قد تفشل في المتصفحات القديمة.
  • غياب المحددات التملكية: لا تدعم جافاسكريبت محددات التملك .*+ أو المجموعات الذرية.
  • هجمات التعطيل ReDoS: الأنماط المتداخلة مثل (a+)+$ تجمد المتصفح. تقوم أداتنا بعزل الفحص في Web Worker مع مؤقت أمان تلقائي.
  • خرافة التحقق الكامل من البريد: تجنب التعابير المعقدة بمئات المحارف لمطابقة RFC 5322. الفحص الهيكلي البسيط مع إرسال رابط تأكيد هو الأسلوب الآمن.

7. أدوات GoToolstack للمطورين

اختبر وطوّر تعابيرك النمطية مباشرة داخل متصفحك دون إرسال بياناتك لأي خادم خارجي:

المراجع التقنية والمعايير الرسمية