Kumpulan Tangkapan
Ekstrak bahagian yang dipadankan
Kumpulan Tangkapan ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah Kumpulan Tangkapan?
Tanda kurung dalam corak membentuk kumpulan tangkapan yang mengingati bahagian teks yang dipadankannya supaya Anda boleh mengekstraknya kemudian.
(\\d+)menangkap rangkaian angka.- Hasilnya disimpan dalam
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;
}Hasil smatch
std::smatch menyimpan hasil padanan. Indeks [0] ialah keseluruhan padanan, manakala [1], [2], ... ialah kumpulan tangkapan mengikut susunan.
#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;
}Beberapa Kumpulan
Anda boleh menangkap beberapa bahagian serentak, contohnya memisahkan tarikh kepada tahun, bulan dan hari.
#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()
Setiap kumpulan menyediakan str() untuk teksnya, position() untuk ofsetnya dan length() untuk saiznya dalam masukan.
#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;
}Awalan dan Akhiran
Objek padanan turut menyediakan prefix() (teks sebelum padanan) dan suffix() (teks selepas padanan).
#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;
}Kumpulan Tanpa Tangkapan
Gunakan (?:...) untuk mengumpulkan tanpa menangkap. Ini memastikan kumpulan bernombor kekal bermakna apabila Anda hanya memerlukan pengumpulan untuk pengkuantiti atau alternasi.
#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;
}Menyemak Sama Ada Kumpulan Dipadankan
Kumpulan pilihan mungkin tidak mengambil bahagian dalam padanan. Uji matched pada subpadanan untuk mengetahui sama ada ia menangkap apa-apa.
#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;
}Melalui Semua Padanan
std::sregex_iterator menelusuri setiap padanan dalam rentetan dan memberikan setiap kumpulan sepanjang proses itu.
#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;
}Mengira Padanan
Gabungkan iterator dengan std::distance untuk mengira berapa kali sesuatu corak muncul.
#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;
}Mengekstrak Pasangan Kunci-Nilai
Dua kumpulan bagi setiap padanan membolehkan Anda menghuraikan teks berstruktur mudah, seperti token 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;
}Menyimpan Tangkapan
Salin subpadanan yang ditangkap ke dalam std::string dengan str() supaya data kekal sah selepas objek padanan tidak lagi wujud.
#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;
}Semakan Pantas
Uji pemahaman Anda tentang pengindeksan kumpulan tangkapan.
Ulang Kaji
Anda telah mempelajari cara mengekstrak data dengan kumpulan tangkapan:
- tanda kurung menangkap;
(?:...)mengumpulkan tanpa menangkap smatch[0]ialah keseluruhan padanan, manakala[1]+ ialah kumpulanstr(),position(),length(),prefix(),suffix()sregex_iteratormenelusuri setiap padanan
Seterusnya, Anda akan mengubah teks menggunakan carian dan penggantian.
Pelajari C++ dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “Kumpulan Tangkapan” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Kumpulan Tangkapan”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Kumpulan Tangkapan”?
Ekstrak bahagian yang dipadankan Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Kumpulan Tangkapan” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Asas regex
- Kumpulan Tangkapan
- Mencari dan Menggantikan
- Nota Prestasi