التعابير النمطية (Regular Expressions أو Regex) أداة قوية لمعالجة النصوص: البحث عن كل أرقام الجوال في ملف، والتحقق من صيغة رقم الهوية في نموذج، واستبدال التواريخ من صيغة إلى أخرى. شكلها مخيف للوهلة الأولى، لكنها تُبنى من قطع صغيرة قليلة. هذا الدليل مرجع سريع مع أمثلة جاهزة، مكتوبة بصيغة JavaScript، وتعمل غالبًا في Python وPHP وغيرها مع فروق بسيطة.
الرموز الأساسية
| الرمز | المعنى | مثال | يطابق |
|---|---|---|---|
. |
أي حرف عدا السطر الجديد | a.c |
abc، a1c |
\d |
رقم 0–9 | \d\d |
42 |
\w |
حرف لاتيني أو رقم أو _ | \w+ |
user_1 |
\s |
مسافة بيضاء (مسافة، tab، سطر) | a\sb |
a b |
\D \W \S |
عكس ما سبق | \D+ |
abc |
[abc] |
أحد هذه الحروف | [aeiou] |
e |
[^abc] |
أي حرف عدا هذه | [^0-9] |
x |
[a-z] |
نطاق | [A-F0-9] |
B، 7 |
^ |
بداية النص (أو السطر مع m) | ^Hi |
Hi في البداية |
$ |
نهاية النص | end$ |
end في النهاية |
\b |
حد كلمة (لاتيني) | \bcat\b |
cat لا category |
| |
أو | jpg|png |
jpg أو png |
\ |
هروب لرمز خاص | \. |
نقطة حرفية |
المحددات الكمية
| الرمز | المعنى |
|---|---|
* |
صفر مرة أو أكثر |
+ |
مرة أو أكثر |
? |
صفر أو مرة (اختياري) |
{3} |
3 مرات بالضبط |
{2,5} |
من 2 إلى 5 |
{2,} |
2 فأكثر |
المجموعات
| الصيغة | الاستخدام |
|---|---|
(abc) |
مجموعة ملتقطة، تُستخدم لاحقًا بـ $1 أو \1 |
(?:abc) |
مجموعة غير ملتقطة (للتجميع فقط) |
(?<year>\d{4}) |
مجموعة مسماة |
(?=abc) |
نظرة للأمام (يتبعه abc) |
(?!abc) |
نظرة للأمام سالبة |
(?<=abc) |
نظرة للخلف |
الأعلام (Flags)
| العلم | المعنى |
|---|---|
g |
كل التطابقات لا الأول فقط |
i |
تجاهل حالة الأحرف اللاتينية |
m |
^ و$ لكل سطر |
s |
النقطة تطابق السطر الجديد أيضًا |
u |
دعم Unicode كامل (ضروري للعربية والإيموجي) |
أمثلة جاهزة
البريد الإلكتروني (تحقق مبدئي)
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
يكفي لرفض الأخطاء الواضحة. لا تحاول تغطية كل حالات المعيار؛ أرسل رسالة تأكيد.
رقم جوال سعودي
^(?:\+966|00966|0)?5\d{8}$
يطابق 0501234567 و+966501234567 و501234567.
رقم جوال إماراتي
^(?:\+971|00971|0)?5[0-9]\d{7}$
يطابق 0501234567 و+971501234567.
رقم جوال مصري
^(?:\+20|0020|0)?1[0125]\d{8}$
يطابق 01012345678 و+201112345678.
تاريخ بصيغة YYYY-MM-DD
^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
يتحقق من الشكل لا من صحة التاريخ (يقبل 2026-02-31). تحقق من الصحة في الكود.
تحويل DD/MM/YYYY إلى YYYY-MM-DD
'08/10/2026'.replace(/^(\d{2})\/(\d{2})\/(\d{4})$/, '$3-$2-$1'); // 2026-10-08
آيبان سعودي (الشكل فقط)
^SA\d{22}$
للتحقق الكامل من رقمي التحقق راجع دليل رقم الآيبان.
أنماط إضافية شائعة
| الغرض | النمط |
|---|---|
| رقم هوية أو إقامة سعودي (10 أرقام يبدأ بـ 1 أو 2) | ^[12]\d{9}$ |
| رمز بريدي سعودي (5 أرقام) | ^\d{5}$ |
| رقم قومي مصري (14 رقمًا يبدأ بـ 2 أو 3) | ^[23]\d{13}$ |
| مسافات متكررة ← مسافة واحدة | البحث \s{2,} والاستبدال بمسافة |
| إزالة وسوم HTML بسيطة | <[^>]+> |
| رابط يبدأ بـ http أو https | ^https?://[^\s]+$ |
هذه أنماط للشكل فقط؛ أرقام الهوية لها خانات تحقق وقواعد لا يكشفها Regex.
النص العربي في Regex
نطاق الحروف العربية
[-ۿ]+
يطابق الحروف العربية الأساسية وعلامات الترقيم والأرقام الهندية (٠–٩). لنطاقات إضافية (الأشكال التقديمية) أضف ﭐ-﷿ﹰ-.
خاصية Unicode (أدق)
/\p{Script=Arabic}+/u
فخاخ عربية
\wلا يطابق العربية في JavaScript. “مرحبا”.match(/\w+/) تعيد null.\bلا يعمل مع الكلمات العربية في JavaScript لأنه مبني على\w. استخدم(?<![\p{L}])و(?![\p{L}])مع العلمu.- التشكيل: “مُحَمَّد” لا يطابق “محمد”. احذف التشكيل أولًا:
text.replace(/[ً-ْ]/g, ''). - أشكال الألف والياء والتاء المربوطة: “أحمد” و“احمد” مختلفان. وحّد قبل البحث:
[أإآا]،[يى]،[ةه]. - الأرقام العربية الهندية (٠١٢) لا يطابقها
\dفي JavaScript. استخدم[0-9٠-٩]. - التطويل (ـ) في “محـــمد” يحتاج إزالة:
ـ.
توحيد النص العربي قبل البحث
const normalize = (s) => s
.replace(/[\u064B-\u0652\u0640]/g, '') // التشكيل والتطويل
.replace(/[أإآ]/g, 'ا')
.replace(/ى/g, 'ي')
.replace(/ة/g, 'ه');
طبّق الدالة على النص وعلى كلمة البحث معًا، فيطابق البحث عن “احمد” كلمة “أَحْمَد”.
الجشع مقابل الكسل
const html = '<b>أ</b> و <b>ب</b>';
html.match(/<b>.*<\/b>/)[0]; // '<b>أ</b> و <b>ب</b>' (جشع)
html.match(/<b>.*?<\/b>/)[0]; // '<b>أ</b>' (كسول)
أضف ? بعد المحدد الكمي ليصبح كسولًا: *?، +?، {2,5}?.
فخاخ شائعة
- نسيان
^و$في التحقق:\d{4}يطابق “12345” لأنه يجد 4 أرقام داخلها. - عدم هروب النقطة:
example.comيطابق “exampleXcom”. استخدمexample\.com. - التراجع الكارثي (Catastrophic backtracking): أنماط مثل
(a+)+$قد تجمّد البرنامج على نصوص معينة. تجنب المحددات المتداخلة على النمط نفسه. - تحليل HTML بـ Regex: مقبول للمهام البسيطة، لكن استخدم محللًا حقيقيًا للصفحات الكاملة.
- نسيان العلم
gعند الاستبدال، فيُستبدل أول تطابق فقط. - الفروق بين اللغات: النظرة للخلف مدعومة في JavaScript الحديث وPython، لكن ليس في كل البيئات.
كيف تكتب وتختبر نمطًا؟
- ابدأ بأمثلة حقيقية: نصوص يجب أن تُطابق وأخرى يجب أن تُرفض.
- اكتب أبسط نمط يطابق المثال الأول.
- أضف الحالات واحدة واحدة.
- اختبر الحالات السلبية.
أداة اختبار Regex تبرز التطابقات والمجموعات لحظيًا وتدعم الأعلام. وإذا كنت تستخرج قيمًا من ملفات JSON، فتحقق من صحتها أولًا في منسق JSON وراجع دليل أساسيات JSON.