التعابير النمطية (Regex) للمبتدئين
التعبير النمطي (Regex) نمط مضغوط يصف مجموعة من السلاسل النصية. يستطيع تعبير واحد إيجاد كل عناوين البريد الإلكتروني في سجل، أو التحقق من حقل رقم هاتف، أو استخراج معرّف الطلب من عنوان URL، أو إعادة تسمية ألف ملف دفعة واحدة. وتفهم كل اللغات الرئيسية — JavaScript وPython وJava وGo وC# وPHP — وكل المحررات وأدوات سطر الأوامر الصياغة الأساسية نفسها.
يعلّمك هذا الدليل تلك الأساسيات: الأحرف الحرفية، وفئات الأحرف، والمحددات الكمية، والمراسي، والمجموعات، والأعلام — مع ملخص سريع وأنماط يمكنك نسخها، والأخطاء التي تجعل التعبير يطابق أكثر أو أقل مما ينبغي.
الأحرف الحرفية والأحرف الخاصة
تطابق معظم الأحرف نفسها: النمط cat يطابق «cat» داخل «concatenate». وهناك اثنا عشر حرفاً خاصاً يجب تهريبها بشرطة مائلة عكسية لمطابقتها حرفياً: . ^ $ * + ? ( ) [ ] { } | \ و/. والنقطة هي التي توقع الناس — يطابق a.b الحرف «a» يليه أي حرف ثم «b»، لذا يطابق «a.b» أيضاً «aXb».
colou?r matches "color" and "colour"
\d{3}-\d{4} matches 555-1234
\. matches a literal dot
https?:// matches http:// and https://فئات الأحرف
- [abc] — واحد من a أو b أو c. [a-z] — أي حرف لاتيني صغير. [^0-9] — أي شيء عدا الأرقام.
- \d — رقم [0-9]. \w — حرف كلمة [A-Za-z0-9_]. \s — مسافة بيضاء (مسافة، جدولة، سطر جديد). الأحرف الكبيرة تعكس المعنى: \D و\W و\S.
- . — أي حرف عدا السطر الجديد (ما لم يُضبط العلم s).
- Unicode — في JavaScript استخدم العلم u و\p{L} لأي حرف، و\p{Script=Arabic} للعربية، و\p{Script=Devanagari} للهندية. بدونه لا يطابق \w سوى ASCII.
المحددات الكمية: كم مرة
- * — صفر أو أكثر. + — واحد أو أكثر. ? — صفر أو واحد.
- {3} — ثلاث مرات بالضبط. {2,5} — من مرتين إلى خمس. {2,} — مرتان أو أكثر.
- المحددات الكمية جشعة: يأخذ .* أكبر قدر ممكن. أضف ? لجعلها كسولة: يتوقف .*? عند أول فرصة. يطابق <.+> على «<a><b>» السلسلة كلها؛ ويطابق <.+?> «<a>» فقط.
المراسي والمجموعات والتناوب
- ^ — بداية السلسلة (أو السطر مع العلم m). $ — النهاية. \b — حد كلمة، فيطابق \bcat\b «cat» ولا يطابق «concatenate».
- ( ) — مجموعة التقاط: يلتقط (\d{4})-(\d{2}) السنة والشهر منفصلين. (?: ) تجمّع دون التقاط. (?<year>\d{4}) تسمّي المجموعة.
- | — التناوب: يطابق jpg|png|gif أياً من الثلاثة. ضعه في مجموعة لتحديد نطاقه: \.(jpg|png|gif)$.
- (?=…) و(?!…) — النظر للأمام: طابق فقط إذا كان ما يليه يطابق (أو لا يطابق) دون استهلاكه. يُستخدم لقواعد كلمات المرور: ^(?=.*\d)(?=.*[A-Z]).{12,}$.
الأعلام
- i — غير حساس لحالة الأحرف. g — شامل (إيجاد كل التطابقات لا الأول فقط). m — متعدد الأسطر: يطابق ^ و$ عند حدود الأسطر.
- s — النقطة تطابق الكل: تطابق . أسطراً جديدة أيضاً. u — وضع Unicode. x (في بعض المحركات) — تجاهل المسافات والسماح بالتعليقات في النمط.
أنماط يمكنك نسخها
Email (practical): ^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
Saudi mobile: ^(?:\+966|0)5\d{8}$
Indian mobile: ^(?:\+91|0)?[6-9]\d{9}$
ISO date: ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
UUID: ^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
URL (loose): ^https?://[^\s/$.?#].[^\s]*$
Hex color: ^#(?:[0-9a-fA-F]{3}){1,2}$
Strong password: ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\w\s]).{12,}$
Trim whitespace: ^\s+|\s+$
Extract order id: /orders/(\d+)أخطاء تجعل التطابق أكثر أو أقل مما ينبغي
- نسيان المراسي: «يتحقق» \d{4} من 12345 لأنه يجد 1234 داخله. استخدم ^\d{4}$.
- نقاط غير مهرّبة: يطابق example.com «exampleXcom». اكتب example\.com.
- محددات جشعة عبر السطر كله: يلتقط "(.*)" في سطر فيه نصان مقتبسان كليهما معاً.
- التراجع الكارثي: المحددات المتداخلة مثل (a+)+ على مدخل غير مطابق قد تستغرق ثوانيَ أو تتجمد. أبقِ المحددات بسيطة واختبر بمدخلات طويلة.
- التحقق من البريد الإلكتروني بنمط عملاق: النمط العملي أعلاه مع بريد تأكيد أفضل من تعبير من 400 حرف ما زال يرفض عناوين صالحة.
- افتراضات اللغة: لا يطابق \w الأحرف العربية أو الديفاناغارية دون وضع Unicode.
الأسئلة الشائعة
فيم تُستخدم التعابير النمطية؟
في إيجاد النصوص التي تتبع نمطاً والتحقق منها واستخراجها واستبدالها: التحقق من النماذج، والبحث في السجلات، واستخراج المعرّفات من السلاسل، وإعادة التسمية بالجملة، والبحث والاستبدال في المحررات.
ماذا يعني \d في Regex؟
أي رقم واحد من 0 إلى 9. يعني \d{3} ثلاثة أرقام بالضبط؛ ويعني \d+ رقماً واحداً أو أكثر.
ما الفرق بين * و+ في Regex؟
يطابق * صفر تكرار أو أكثر (فقد يغيب العنصر)؛ بينما يشترط + تكراراً واحداً على الأقل.
هل Regex واحد في كل اللغات؟
الصياغة الأساسية مشتركة، لكن التفاصيل تختلف: دعم النظر للخلف، والمجموعات المسمّاة، وفئات Unicode، والأعلام تتباين بين JavaScript وPython (re) وJava وPCRE (PHP) وGo (RE2 الذي لا يتراجع).
كيف أختبر تعبيراً نمطياً؟
الصق النمط ونصاً تجريبياً في أداة اختبار تبرز التطابقات والمجموعات، ثم جرّب مدخلات لا ينبغي أن تتطابق. ضمّن مدخلات طويلة وغير معتادة لاكتشاف مشكلات الأداء.
هل يمكنني استخدام Regex لتحليل HTML أو JSON؟
لاستخراج سريع لمرة واحدة، نعم. أما لأي شيء موثوق فلا — البنى المتداخلة تحتاج إلى محلّل حقيقي. استخدم عارض شجرة JSON أو JSONPath مع JSON.
الأدوات المذكورة في هذا الدليل
اختبر التعابير النمطية مباشرةً مع إبراز التطابقات ومجموعات الالتقاط ومعاينة الاستبدال.
احصل على شرح بالإنجليزية المبسّطة لأي تعبير نمطي، رمزاً رمزاً.
أنشئ تعابير نمطية من مكتبة أنماط مختبَرة (البريد الإلكتروني، URL، IP، التواريخ، IBAN، أرقام الهواتف السعودية والأردنية…) ومن قواعد مخصصة.
قارن نصّين سطراً بسطر أو كلمةً بكلمة مع إبراز الاختلافات.
تقييم تعبيرات JSONPath ($.store.book[*].author) على JSON وعرض النتائج المطابقة فوراً.