للتعبيرات النمطية سمعة بأنها تبدو كضوضاء عشوائية. نمط مثل ^[\w.-]+@[\w-]+\.\w{2,}$ قد يبدو وكأن قطة مشت على لوحة المفاتيح. لكن وراء الصياغة الغامضة تكمن فكرة أنيقة بشكل ملحوظ: لغة موجزة لوصف الأنماط في النصوص.
سواء كنت تتحقق من مدخلات النماذج أو تبحث في ملفات السجلات أو تنظف البيانات أو تجري بحثاً واستبدالاً في قاعدة الشفرة، فإن regex واحدة من أكثر الأدوات تنوعاً في مجموعة أدوات المطور. ولا تحتاج لحفظ كل ميزة غامضة لتحصل على فائدة حقيقية. حفنة من اللبنات الأساسية تغطي الغالبية العظمى من حالات الاستخدام العملية.
ما تفعله regex فعلاً
التعبير النمطي (regex أو regexp) هو نمط يصف مجموعة من السلاسل النصية. تقدمه لمحرك بحث — في لغة البرمجة أو محرر النصوص أو أداة سطر الأوامر — ويجد كل سلسلة تطابقه.
فكر فيه كاستعلام بحث مطوّر:
- بحث عادي: ابحث عن الكلمة الدقيقة "error"
- بحث regex: ابحث عن أي شيء يبدو كعنوان IP أو تاريخ أو عنوان بريد إلكتروني أو أي بنية يمكنك وصفها
اخترع عالم الرياضيات ستيفن كليني regex عام 1956 ودخلت عالم الحوسبة عبر محررات نصوص Unix في الستينيات. اليوم تدعمها فعلياً كل لغة برمجة ومحرر نصوص.
اللبنات الأساسية
الأحرف الحرفية
أبسط regex هو نص عادي. النمط hello يطابق السلسلة "hello" أينما ظهرت. لا شيء معقد.
النقطة (.) — أي حرف
تطابق النقطة أي حرف واحد باستثناء سطر جديد.
h.tيطابق "hat" و"hit" و"hot" و"h3t" وحتى "h t"
فئات الأحرف ([])
الأقواس المربعة تحدد مجموعة من الأحرف المسموحة في موضع واحد.
[aeiou]— أي حرف علة[0-9]— أي رقم[A-Za-z]— أي حرف[^0-9]— أي حرف ليس رقماً (علامة^داخل الأقواس تعني "ليس")
الاختصارات
| الاختصار | المعنى | المكافئ |
|---|---|---|
\d |
أي رقم | [0-9] |
\w |
حرف كلمة | [A-Za-z0-9_] |
\s |
مسافة بيضاء | [ \t\n\r] |
\D |
ليس رقماً | [^0-9] |
\W |
ليس حرف كلمة | [^A-Za-z0-9_] |
\S |
ليس مسافة بيضاء | [^ \t\n\r] |
المحددات الكمية — كم مرة
تتحكم المحددات الكمية في عدد مرات ظهور العنصر السابق.
| الرمز | المعنى | مثال | يطابق |
|---|---|---|---|
* |
صفر أو أكثر | ab*c |
"ac"، "abc"، "abbc" |
+ |
واحد أو أكثر | ab+c |
"abc"، "abbc" (ليس "ac") |
? |
صفر أو واحد | colou?r |
"color" و"colour" |
{3} |
بالضبط 3 | \d{3} |
"123"، "456" |
{2,4} |
بين 2 و4 | \d{2,4} |
"12"، "123"، "1234" |
المراسي — الموضع
^— بداية السلسلة (أو السطر، مع علمm)$— نهاية السلسلة (أو السطر)\b— حد الكلمة
النمط ^\d{4}$ يطابق سلسلة مكونة من أربعة أرقام بالضبط، مثل "2026"، لكن ليس "abc2026" أو "2026xyz".
المجموعات والتناوب
(abc)— يلتقط "abc" كمجموعةa|b— يطابق "a" أو "b"(cat|dog)— يطابق "cat" أو "dog"
المجموعات تتيح أيضاً تطبيق المحددات الكمية على التسلسلات: (ha)+ يطابق "ha" و"haha" و"hahaha".
أنماط عملية شائعة
التحقق من بريد إلكتروني (أساسي)
^[\w.-]+@[\w-]+\.\w{2,}$
يطابق هذا user@example.com وfirst.last@company.co.uk (جزئياً)، ويرفض السلاسل بدون @ أو نطاق.
مهم: التحقق المثالي من عناوين البريد الإلكتروني باستخدام regex أمر صعب بشكل معروف — مواصفة RFC 5322 الكاملة معقدة للغاية. للأنظمة الإنتاجية، استخدم regex أساسية للتحقق من التنسيق ثم تحقق من العنوان بإرسال بريد تأكيد.
مطابقة رقم هاتف
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
يتعامل مع تنسيقات مثل +1 555 123 4567 و555-123-4567 و(555) 123-4567.
مطابقة عنوان URL
https?://[\w.-]+(/[\w./?&=-]*)?
يطابق https://example.com وhttp://example.com/path?q=hello.
مطابقة تاريخ (YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
يطابق 2026-03-29 و1999-12-31. ملاحظة: هذا يتحقق من التنسيق فقط وليس الصلاحية — سيطابق أيضاً 9999-99-99.
الأعلام التي تغير السلوك
معظم محركات regex تدعم أعلاماً تعدّل كيفية تطبيق النمط:
| العلم | الاسم | التأثير |
|---|---|---|
g |
شامل (Global) | يجد كل التطابقات، وليس الأولى فقط |
i |
غير حساس لحالة الأحرف | hello يطابق "Hello" و"HELLO" إلخ. |
m |
متعدد الأسطر (Multiline) | ^ و$ يطابقان بداية/نهاية كل سطر |
s |
Dotall | . يطابق أيضاً أحرف السطر الجديد |
في JavaScript، تُلحق الأعلام بعد الشرطة المائلة الختامية: /hello/gi. في Python، تُمرر كمعاملات: re.findall(r"hello", text, re.IGNORECASE).
متى تكون regex مبالغة
Regex قوية، لكنها ليست دائماً الأداة الصحيحة:
- تحليل HTML أو XML. استخدم محلل DOM مناسب. لا يمكن لـ regex التعامل بموثوقية مع الوسوم المتداخلة.
- تحليل JSON. استخدم
JSON.parse()أو ما يكافئها. ستفشل regex في الحالات الحدية. - التحقق المعقد. إذا كان نمطك يمتد عبر عدة أسطر ويستغرق خمس دقائق لقراءته، فكر في كتابة شفرة تحقق إجرائية بدلاً منه.
- عمليات السلاسل البسيطة. إذا كنت تحتاج فقط
startsWith()أوincludes()أوsplit()، فطرق السلاسل العادية أوضح وأسرع.
الأخطاء الشائعة
- نسيان تهريب الأحرف الخاصة. النقطة
.تطابق أي حرف. لمطابقة نقطة حرفية، استخدم\.. الأمر نفسه ينطبق على(،)،[،]،+،*،?،{،}،^،$،|، و\. - المطابقة الجشعة مقابل الكسولة. افتراضياً،
.*جشعة — تطابق أكثر ما يمكن. أضف?لجعلها كسولة:.*?تطابق أقل ما يمكن. هذا مهم عند استخراج محتوى بين محددات. - التراجع الكارثي. المحددات الكمية المتداخلة مثل
(a+)+قد تتسبب في تجربة المحرك لعدد أسي من المسارات على مدخلات معينة، مما يجمّد برنامجك. تجنب التكرار المتداخل على أنماط متداخلة. - نسيان المراسي. بدون
^و$، يطابق نمطك سلاسل فرعية.\d{3}يطابق "123" داخل "abc12345". استخدم^\d{3}$إذا كنت بحاجة لمطابقة دقيقة.
للمزيد
أفضل طريقة لتعلم regex هي التجريب. اكتب نمطاً، والصق نصاً اختبارياً، وشاهد ما يُضاء. عدّل وكرر حتى تفهم كيف يعمل كل جزء.
- كيف تختبر أنماط Regex — درس تفاعلي مع أمثلة
- اختبار Regex — الصق نمطك وبيانات الاختبار، وشاهد التطابقات مميزة في الوقت الحقيقي
