التعبيرات النمطية للنصوص العربية
نطاقات الحروف العربية والتشكيل، وأنماط جاهزة تجرّبها بضغطة.
النص والتطابقات مميّزة
0 تطابق
لماذا لا يعمل \b مع العربية؟
حدّ الكلمة \b معرّف بأنه الحد بين محرف من \w وغيره، و\w في جافاسكربت هو [A-Za-z0-9_] فقط. فكل حرف عربي محرف «غير كلمة»، ويصير \bعمل\b يطابق داخل «أعمال» أيضًا. البديل أن تمنع وجود حرف عربي قبل الكلمة وبعدها:
(?<![\u0621-\u064A])عمل(?![\u0621-\u064A])الحروف العربية ونطاقاتها
العربية في يونيكود ليست نطاقًا واحدًا: الحروف الأساسية في نطاق، والتشكيل في نطاق، والأرقام الهندية في ثالث.
[\u0621-\u064A]الحروف العربية الأساسية من الهمزة إلى الياء، بلا تشكيل ولا أرقام.
[\u0600-\u06FF]الكتلة العربية كاملة: الحروف والتشكيل والأرقام الهندية وعلامات الترقيم العربية.
\p{Script=Arabic}كل ما يُكتب بالخط العربي، ويشمل الفارسية والأردية. يحتاج الراية u.
[\u064B-\u0652]التشكيل: الفتحة والضمة والكسرة والتنوين والشدة والسكون.
[\u064B-\u0652\u0640\u0670]التشكيل مع التطويل (ـــ) والألف الخنجرية: هذا ما تحذفه لتجريد النص.
[\u0660-\u0669]الأرقام العربية الهندية ٠١٢٣٤٥٦٧٨٩ (وليست 0123456789).
[\u06F0-\u06F9]الأرقام الفارسية ۰۱۲۳۴۵۶۷۸۹، وتختلف عن الهندية في أربعة أشكال.
[أإآ]الهمزات على الألف، لتوحيدها بـ «ا» قبل البحث أو المقارنة.
[ةه]$التاء المربوطة أو الهاء في آخر الكلمة، من أشهر أسباب فشل البحث.
أنماط جاهزة للبيانات العربية
هذه أنماط تحقق من الشكل لا من صحة البيانات نفسها: الرقم قد يكون بالشكل الصحيح وغير مسجَّل.
(?:\+?966|0)?5\d{8}رقم جوال سعودي بأي صيغة: 05… أو 9665… أو +9665…
(?:\+?20|0)?1[0125]\d{8}رقم موبايل مصري: 010 و011 و012 و015.
(?:\+?971|0)?5[024568]\d{7}رقم موبايل إماراتي: 050 و052 و054 و055 و056 و058.
^[12]\d{9}$رقم الهوية السعودية: عشرة أرقام تبدأ بـ 1 للمواطن و2 للمقيم.
^[23]\d{13}$الرقم القومي المصري: أربعة عشر رقمًا تبدأ بـ 2 لمواليد القرن العشرين و3 للحادي والعشرين.
^SA\d{22}$آيبان سعودي: SA ثم 22 رقمًا (24 محرفًا بلا مسافات).
^EG\d{27}$آيبان مصري: EG ثم 27 رقمًا.
[\w.+-]+@[\w-]+\.[\w.]{2,}بريد إلكتروني بشكل عملي بسيط. لا تبالغ في تعقيد نمط البريد؛ التحقق الحقيقي برسالة تأكيد.
https?://[^\s<>"]+رابط داخل نص، حتى أول مسافة.
#[\u0621-\u064A\w_]+هاشتاق عربي أو إنجليزي.
\b\d{4}-\d{2}-\d{2}\bتاريخ بصيغة ISO: سنة-شهر-يوم.
الأساسيات
.أي محرف واحد عدا السطر الجديد (إلا مع الراية s).
\d \Dرقم لاتيني 0-9، وعكسه. انتبه: لا يشمل ٠-٩ إلا مع النمط المناسب.
\w \Wحرف كلمة: A-Z و a-z و 0-9 و _ فقط. الحروف العربية ليست منها.
\s \Sمسافة أو Tab أو سطر جديد، وعكسها.
^ $بداية النص ونهايته، أو بداية كل سطر ونهايته مع الراية m.
\bحد الكلمة. مبني على \w، فلا يعمل مع العربية كما تتوقع.
[abc] [^abc]أي من هذه المحارف، وأي محرف عداها.
a|bهذا أو ذاك.
التكرار
* + ?صفر فأكثر، وواحد فأكثر، وصفر أو واحد.
{3} {2,} {2,5}ثلاث مرات بالضبط، ومرتان فأكثر، ومن مرتين إلى خمس.
+? *? {2,5}?التكرار الكسول: يأخذ أقل ما يمكن بدل أن يمتد إلى آخر ما يستطيع.
المجموعات والنظر
(…)مجموعة تلتقط ما بداخلها، ويشار إليها في الاستبدال بـ $1 و$2.
(?:…)مجموعة للتجميع فقط بلا التقاط، أسرع وأنظف.
(?<name>…)مجموعة مسماة، ويشار إليها بـ $<name> في الاستبدال.
(?=…) (?!…)يتبعه كذا، ولا يتبعه كذا، دون أن يدخلا في التطابق.
(?<=…) (?<!…)يسبقه كذا، ولا يسبقه كذا.
عن الأداة
العربية في يونيكود ليست نطاقًا واحدًا. الحروف الأساسية من الهمزة إلى الياء في [\u0621-\u064A]، والتشكيل في [\u064B-\u0652]، والتطويل (الكشيدة) محرف مستقل \u0640، والأرقام العربية الهندية ٠-٩ في [\u0660-\u0669] والفارسية ۰-۹ في [\u06F0-\u06F9]. والكتلة العربية كاملة [\u0600-\u06FF] تشمل ذلك كله وعلامات ترقيم عربية.
أكثر خطأ شائع أن يُستخدم \b لتحديد كلمة عربية. حدّ الكلمة معرّف على \w أي [A-Za-z0-9_]، فالحروف العربية عنده «غير كلمة» وتصير الحدود في غير مواضعها. البديل نظرة خلفية وأمامية تمنعان وجود حرف عربي قبل الكلمة وبعدها، وهو مشروح هنا بمثال جاهز.
قبل أي بحث أو مقارنة، وحّد النص: احذف التشكيل والتطويل، ووحّد الهمزات (أ إ آ) إلى ألف، والتاء المربوطة إلى هاء أو العكس، والألف المقصورة إلى ياء. كثير من «الأنماط التي لا تعمل» سببها اختلاف شكل الحرف لا النمط نفسه.
الأنماط الجاهزة هنا للبيانات الشائعة في المنطقة: أرقام الجوال السعودي والمصري والإماراتي بكل صيغها، ورقم الهوية، والآيبان، والبريد والرابط والهاشتاق. وهي تتحقق من الشكل فقط؛ صحة الرقم نفسه تحتاج تحققًا من الجهة المصدرة.
أسئلة شائعة
ما الفرق بين \p{Script=Arabic} ونطاق الحروف؟
\p{Script=Arabic} يشمل كل ما يُكتب بالخط العربي، ومنه حروف فارسية وأردية ليست عربية. إن أردت العربية وحدها فالنطاق الصريح أدق، وهو يعمل بلا الراية u أيضًا.
كيف أحذف التشكيل من نص؟
استبدل [\u064B-\u0652\u0670\u0640] بلا شيء. في الموقع صفحة جاهزة لإزالة التشكيل إن لم ترد كتابة كود.
هل تعمل هذه الأنماط في PHP وPython؟
أغلبها نعم مع فروق صغيرة: في PHP أضف الراية u لمعالجة UTF-8، وفي بايثون استخدم سلاسل خام r"…" وستجد دعم \p في مكتبة regex لا في re.