التعبيرات النمطية في C++ مع أمثلة للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التعبيرات النمطية في C++ مع أمثلة: دليل كامل للمبتدئين

\n\n

التعبيرات النمطية (regex) هي أداة قوية للبحث والتحقق واستبدال النص وفقًا لنمط معين. في لغة C++، يتم التعامل مع التعبيرات النمطية من خلال مكتبة <regex> التي ظهرت في معيار C++11. في هذه المقالة، سنشرح أساسيات العمل مع regex في C++ من خلال أمثلة عملية مفهومة حتى للمبتدئين.

\n\n

ما هي التعبيرات النمطية ولماذا نحتاجها؟

\n\n

التعبير النمطي هو سلسلة من الأحرف تحدد نمطًا للبحث في النص. على سبيل المثال، النمط \\d{3}-\\d{2}-\\d{2} يصف تنسيق رقم SNILS: ثلاثة أرقام، شرطة، رقمان، شرطة، رقمان.

\n\n

المهام الرئيسية التي تحلها التعبيرات النمطية في C++:

\n\n
    \n
  • التحقق من صحة الإدخال (البريد الإلكتروني، رقم الهاتف، التاريخ)
  • \n
  • استخراج البيانات من النص
  • \n
  • البحث عن السلاسل الفرعية واستبدالها
  • \n
  • تقسيم السلاسل بناءً على فواصل معقدة
  • \n
\n\n

توفر مكتبة <regex> ثلاث خوارزميات رئيسية:

\n\n
    \n
  • std::regex_match — تطابق كامل للسلسلة مع النمط
  • \n
  • std::regex_search — البحث عن تطابق في السلسلة
  • \n
  • std::regex_replace — استبدال التطابقات وفقًا للنمط
  • \n
\n\n

الصياغة الأساسية للتعبيرات النمطية في C++

\n\n

قبل كتابة الكود، دعنا نشرح العناصر الأساسية لصياغة regex التي سنستخدمها في الأمثلة:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n
الرمزالمعنىمثال
.أي حرف (باستثناء السطر الجديد)c.t — cat, cot, cut
\\dرقم (0-9)\\d\\d — 23, 45, 99
\\wحرف أو رقم أو شرطة سفلية\\w+ — كلمة
\\sحرف مسافة بيضاء\\s+ — مسافة واحدة أو أكثر
*0 تكرار أو أكثرab*c — ac, abc, abbc
+1 تكرار أو أكثرab+c — abc, abbc (وليس ac)
?0 أو 1 تكرارcolou?r — color, colour
{n}بالضبط n تكرار\\d{3} — 123, 456
[abc]أي حرف من المجموعة[aeiou] — حرف علة
()مجموعة للالتقاط(\\d{2})-(\\d{2})
\n\n

مثال 1: التحقق من عنوان البريد الإلكتروني باستخدام regex_match

\n\n

لنبدأ بشيء بسيط — التحقق مما إذا كانت السلسلة تتطابق مع تنسيق البريد الإلكتروني. سنستخدم std::regex_match الذي يتطلب تطابقًا كاملاً.

\n\n
#include <iostream>\n#include <regex>\n#include <string>\n\nint main() {\n    std::string email = "user@example.com";\n    // نمط بسيط للبريد الإلكتروني:\n    // [\\w.]+ — حرف واحد أو أكثر (أحرف، أرقام، نقطة، شرطة سفلية)\n    // @ — رمز @\n    // [\\w.]+ — اسم النطاق\n    // \\.[a-z]{2,} — نقطة ونطاق المستوى الأعلى (حرفان على الأقل)\n    std::regex pattern(R"([\\w.]+@[\\w.]+\\.\\w{2,})");\n    \n    if (std::regex_match(email, pattern)) {\n        std::cout << "البريد الإلكتروني صحيح" << std::endl;\n    } else {\n        std::cout << "البريد الإلكتروني غير صحيح" << std::endl;\n    }\n    \n    // مثال مع بريد إلكتروني غير صالح\n    email = "user@com";\n    if (std::regex_match(email, pattern)) {\n        std::cout << "البريد الإلكتروني صحيح" << std::endl;\n    } else {\n        std::cout << "البريد الإلكتروني غير صحيح" << std::endl;\n    }\n    \n    return 0;\n}
\n\n

نتيجة التشغيل:

\n
البريد الإلكتروني صحيح\nالبريد الإلكتروني غير صحيح
\n\n

لاحظ أن

المدونات

توصيات الكتب