التعبيرات المنتظمة في C++: دليل شامل مع أمثلة

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

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

ابدأ الدورة

التعبيرات النمطية في C++: أداة قوية للتعامل مع النصوص

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

في هذه المقالة، سنشرح الوظائف الرئيسية لمكتبة regex، ونتعلم كيفية إنشاء الأنماط، ونستعرض أمثلة عملية مع الكود.



1. الأنواع والوظائف الأساسية لمكتبة <regex>

للعمل مع التعبيرات النمطية في C++، يتم استخدام ثلاث فئات رئيسية:

  • std::regex — تمثل التعبير النمطي نفسه (النمط).
  • std::smatch — حاوية لتخزين نتائج البحث (لنوع النص std::string).
  • std::cmatch — نظير للنصوص من نوع C (const char*).

الوظائف الرئيسية لتطبيق regex:

  • std::regex_match() — تتحقق مما إذا كان النص بأكمله يطابق النمط.
  • std::regex_search() — تبحث عن أول تطابق مع النمط في النص.
  • std::regex_replace() — تستبدل جميع التطابقات بنص محدد.


#include <iostream>#include <regex>#include <string>

int main() { std::string text = "رقمي: +7-123-456-78-90"; std::regex pattern(R"(\\+7-\\d{3}-\\d{3}-\\d{2}-\\d{2})");

if (std::regex_search(text, pattern)) { std::cout << "تم العثور على الرقم!" << std::endl; }

// استخراج التطابق std::smatch match; if (std::regex_search(text, match, pattern)) { std::cout << "الرقم الذي تم العثور عليه: " << match[0] << std::endl; }

return 0;}


2. بناء جملة التعبيرات النمطية: الرموز الوصفية والمحددات الكمية

تستخدم أنماط regex في C++ بناء جملة مشابهاً لـ ECMAScript (افتراضياً). إليك العناصر الأساسية:

  • النقطة (.) — أي حرف واحد، باستثناء سطر جديد.
  • النجمة (*) — 0 أو أكثر من تكرارات الحرف السابق.
  • علامة الجمع (+) — 1 أو أكثر من التكرارات.
  • علامة الاستفهام (?) — 0 أو 1 تكرار (تجعل الحرف اختيارياً).
  • الأقواس المربعة ([]) — فئة من الأحرف (مثلاً، [0-9] — أي رقم).
  • الأقواس المستديرة (()) — التجميع والتقاط النص الفرعي.
  • الخط العمودي (|) — أو منطقي.
  • الرمز ^ — بداية النص.
  • الرمز $ — نهاية النص.

أمثلة على المحددات الكمية:

  • \\d{3} — 3 أرقام بالضبط.
  • \\w{2,4} — من 2 إلى 4 أحرف أبجدية رقمية.
  • [A-Za-z]+ — حرف لاتيني واحد أو أكثر.


#include <iostream>#include <regex>#include <string>

int main() { std::string email = "user@example.com"; // نمط بسيط للبريد الإلكتروني std::regex email_pattern(R"([\\w.+-]+@[\\w-]+\\.[\\w.]+)");

if (std::regex_match(email, email_pattern)) { std::cout << "البريد الإلكتروني صحيح." << std::endl; } else { std::cout << "البريد الإلكتروني غير صحيح." << std::endl; }

// التحقق من رقم الهاتف std::string phone = "+7 (495) 123-45-67"; std::regex phone_pattern(R"(\\+7\\s?\\(?\\d{3}\\)?\\s?\\d{3}-?\\d{2}-?\\d{2})");

if (std::regex_match(phone, phone_pattern)) { std::cout << "رقم الهاتف صحيح." << std::endl; }

return 0;}


3. استخراج البيانات باستخدام مجموعات الالتقاط

مجموعات الالتقاط

المدونات

توصيات الكتب