0Pricing
C++ Academy · درس

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

استخرج الأجزاء المطابقة

المجموعات الملتقطة درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

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

تنشئ الأقواس في النمط مجموعة التقاط، فتحتفظ بالجزء الذي طابقته من النص لكي تتمكن من استخراجه لاحقًا.

  • تلتقط (\\d+) سلسلةً متتابعة من الأرقام.
  • تُخزَّن النتائج في std::smatch.
#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d+)");
    std::smatch m;
    std::string s = "order 42";
    if (std::regex_search(s, m, p)) {
        std::cout << "Captured: " << m[1] << '\n';
    }
    return 0;
}

نتيجة smatch

يخزّن std::smatch نتائج المطابقة. يشير الفهرس [0] إلى المطابقة بأكملها، بينما تشير [1] و[2] و... إلى مجموعات الالتقاط بالترتيب.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\w+)@(\\w+)");
    std::smatch m;
    std::string s = "user@host";
    if (std::regex_search(s, m, p)) {
        std::cout << "Whole: " << m[0] << '\n';
        std::cout << "User: " << m[1] << ", Host: " << m[2] << '\n';
    }
    return 0;
}

مجموعات متعددة

يمكنك التقاط عدة أجزاء في آن واحد، مثل تقسيم تاريخ إلى سنة وشهر ويوم.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d{4})-(\\d{2})-(\\d{2})");
    std::smatch m;
    std::string s = "2026-05-30";
    if (std::regex_match(s, m, p)) {
        std::cout << "Y=" << m[1] << " M=" << m[2] << " D=" << m[3] << '\n';
    }
    return 0;
}

str() وposition() وlength()

توفر كل مجموعة الدالة str() للحصول على نصها، والدالة position() للحصول على إزاحتها، والدالة length() للحصول على طولها ضمن الإدخال.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d+)");
    std::smatch m;
    std::string s = "abc 789 xyz";
    if (std::regex_search(s, m, p)) {
        std::cout << "str: " << m[1].str() << '\n';
        std::cout << "pos: " << m.position(1) << '\n';
        std::cout << "len: " << m.length(1) << '\n';
    }
    return 0;
}

البادئة واللاحقة

يتيح كائن المطابقة أيضًا الدالة prefix() للنص السابق للمطابقة، والدالة suffix() للنص اللاحق لها.

#include <iostream>
#include <regex>

int main() {
    std::regex p("\\d+");
    std::smatch m;
    std::string s = "left 55 right";
    if (std::regex_search(s, m, p)) {
        std::cout << "prefix: [" << m.prefix() << "]\n";
        std::cout << "suffix: [" << m.suffix() << "]\n";
    }
    return 0;
}

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

استخدم (?:...) لتجميع العناصر دون التقاطها. يحافظ ذلك على دلالة مجموعاتك المرقمة عندما تحتاج إلى التجميع فقط مع محددات التكرار أو التناوب.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(?:Mr|Ms) (\\w+)");
    std::smatch m;
    std::string s = "Ms Smith";
    if (std::regex_search(s, m, p)) {
        std::cout << "Name: " << m[1] << '\n';
    }
    return 0;
}

التحقق من مطابقة مجموعة

قد لا تشارك المجموعة الاختيارية في المطابقة. اختبر matched في المطابقة الفرعية لمعرفة ما إذا كانت قد التقطت شيئًا.

#include <iostream>
#include <regex>

int main() {
    std::regex p("file(\\.txt)?");
    std::smatch m;
    std::string s = "file";
    if (std::regex_match(s, m, p)) {
        std::cout << std::boolalpha << "ext matched: " << m[1].matched << '\n';
    }
    return 0;
}

التكرار على جميع المطابقات

يتنقل std::sregex_iterator بين كل المطابقات في السلسلة، ويمنحك كل مجموعة على الطريق.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d+)");
    std::string s = "a1 b22 c333";
    auto begin = std::sregex_iterator(s.begin(), s.end(), p);
    auto end = std::sregex_iterator();
    for (auto it = begin; it != end; ++it) {
        std::cout << (*it)[1] << '\n';
    }
    return 0;
}

عدّ المطابقات

اجمع بين المكرّر وstd::distance لحساب عدد مرات ظهور النمط.

#include <iostream>
#include <regex>

int main() {
    std::regex p("\\d+");
    std::string s = "1 22 333 4444";
    auto begin = std::sregex_iterator(s.begin(), s.end(), p);
    auto end = std::sregex_iterator();
    std::cout << "Count: " << std::distance(begin, end) << '\n';
    return 0;
}

استخراج أزواج المفتاح والقيمة

تتيح لك مجموعتان لكل مطابقة تحليل نص منظم بسيط، مثل الرموز key=value.

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\w+)=(\\w+)");
    std::string s = "a=1 b=2 c=3";
    auto begin = std::sregex_iterator(s.begin(), s.end(), p);
    auto end = std::sregex_iterator();
    for (auto it = begin; it != end; ++it) {
        std::cout << (*it)[1] << " -> " << (*it)[2] << '\n';
    }
    return 0;
}

تخزين الالتقاطات

انسخ المطابقة الفرعية الملتقطة إلى std::string باستخدام str() حتى تظل البيانات صالحة بعد زوال كائن المطابقة.

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

int main() {
    std::regex p("v(\\d+)");
    std::smatch m;
    std::string s = "version v7";
    std::string version;
    if (std::regex_search(s, m, p)) {
        version = m[1].str();
    }
    std::cout << "Stored: " << version << '\n';
    return 0;
}

تحقق سريع

اختبر مدى فهمك لفهرسة مجموعات الالتقاط.

مراجعة

تعلّمت كيفية استخراج البيانات باستخدام مجموعات الالتقاط:

  • تلتقط الأقواس النص، بينما تجمع (?:...) العناصر دون التقاطها
  • تمثل smatch[0] المطابقة بأكملها، وتمثل [1] وما بعدها المجموعات
  • الدوال str() وposition() وlength() وprefix() وsuffix()
  • يتنقل sregex_iterator بين كل المطابقات

بعد ذلك، ستغيّر النص باستخدام البحث والاستبدال.

الأسئلة الشائعة

هل درس «المجموعات الملتقطة» مجاني؟

نعم — نص درس «المجموعات الملتقطة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «المجموعات الملتقطة»؟

استخرج الأجزاء المطابقة تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «المجموعات الملتقطة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات regex
  2. المجموعات الملتقطة
  3. البحث والاستبدال
  4. ملاحظات حول الأداء
← العودة إلى C++ Academy