التعبيرات النمطية في C++ مع أمثلة: دليل كامل للمبتدئين
\n\nالتعبيرات النمطية (regex) هي أداة قوية للبحث والتحقق واستبدال النص وفقًا لنمط معين. في لغة C++، يتم التعامل مع التعبيرات النمطية من خلال مكتبة <regex> التي ظهرت في معيار C++11. في هذه المقالة، سنشرح أساسيات العمل مع regex في C++ من خلال أمثلة عملية مفهومة حتى للمبتدئين.
ما هي التعبيرات النمطية ولماذا نحتاجها؟
\n\nالتعبير النمطي هو سلسلة من الأحرف تحدد نمطًا للبحث في النص. على سبيل المثال، النمط \\d{3}-\\d{2}-\\d{2} يصف تنسيق رقم SNILS: ثلاثة أرقام، شرطة، رقمان، شرطة، رقمان.
المهام الرئيسية التي تحلها التعبيرات النمطية في C++:
\n\n- \n
- التحقق من صحة الإدخال (البريد الإلكتروني، رقم الهاتف، التاريخ) \n
- استخراج البيانات من النص \n
- البحث عن السلاسل الفرعية واستبدالها \n
- تقسيم السلاسل بناءً على فواصل معقدة \n
توفر مكتبة <regex> ثلاث خوارزميات رئيسية:
- \n
std::regex_match— تطابق كامل للسلسلة مع النمط \n std::regex_search— البحث عن تطابق في السلسلة \n std::regex_replace— استبدال التطابقات وفقًا للنمط \n
الصياغة الأساسية للتعبيرات النمطية في C++
\n\nقبل كتابة الكود، دعنا نشرح العناصر الأساسية لصياغة regex التي سنستخدمها في الأمثلة:
\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}) |
مثال 1: التحقق من عنوان البريد الإلكتروني باستخدام regex_match
\n\nلنبدأ بشيء بسيط — التحقق مما إذا كانت السلسلة تتطابق مع تنسيق البريد الإلكتروني. سنستخدم std::regex_match الذي يتطلب تطابقًا كاملاً.
#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لاحظ أن