กลุ่มจับคู่
แยกส่วนที่จับคู่ได้
กลุ่มจับคู่ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ