0Pricing
C++ Academy · บทเรียน

กลุ่มจับคู่

แยกส่วนที่จับคู่ได้

กลุ่มจับคู่ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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 วนผ่านการจับคู่ทุกครั้ง

ถัดไป คุณจะได้แปลงข้อความโดยใช้การค้นหาและการแทนที่

คำถามที่พบบ่อย

บทเรียน “กลุ่มจับคู่” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “กลุ่มจับคู่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “กลุ่มจับคู่”

แยกส่วนที่จับคู่ได้ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “กลุ่มจับคู่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน regex
  2. กลุ่มจับคู่
  3. การค้นหาและแทนที่
  4. ข้อสังเกตด้านประสิทธิภาพ
← กลับไปที่ C++ Academy