Grupy przechwytujące
Wyodrębniaj dopasowane fragmenty
Grupy przechwytujące to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Czym jest grupa przechwytująca?
Nawiasy we wzorcu tworzą grupę przechwytującą, która zapamiętuje dopasowany fragment tekstu, aby można go było później wyodrębnić.
(\\d+)przechwytuje ciąg cyfr.- Wyniki trafiają do obiektu
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;
}Wynik smatch
std::smatch przechowuje wyniki dopasowania. Indeks [0] oznacza całe dopasowanie, a [1], [2], ... oznaczają kolejne grupy przechwytujące.
#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;
}Wiele grup
Można przechwycić kilka fragmentów jednocześnie, na przykład rozdzielić datę na rok, miesiąc i dzień.
#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()
Każda grupa udostępnia str() zwracające jej tekst, position() zwracające jej przesunięcie oraz length() zwracające jej długość w danych wejściowych.
#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;
}Prefiks i sufiks
Obiekt dopasowania udostępnia również prefix() (tekst przed dopasowaniem) i suffix() (tekst po nim).
#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;
}Grupy nieprzechwytujące
Należy użyć (?:...), aby grupować bez przechwytywania. Dzięki temu numerowane grupy zachowują znaczenie, gdy grupowanie jest potrzebne wyłącznie do stosowania kwantyfikatorów lub alternatywy.
#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;
}Sprawdzanie, czy grupa została dopasowana
Opcjonalna grupa może nie uczestniczyć w dopasowaniu. Należy sprawdzić wartość matched w poddopasowaniu, aby ustalić, czy grupa coś przechwyciła.
#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;
}Iterowanie po wszystkich dopasowaniach
std::sregex_iterator przechodzi przez każde dopasowanie w łańcuchu i po drodze udostępnia każdą grupę.
#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;
}Zliczanie dopasowań
Można połączyć iterator z std::distance, aby policzyć, ile razy występuje dany wzorzec.
#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;
}Wyodrębnianie par klucz-wartość
Dwie grupy na dopasowanie pozwalają analizować prosty ustrukturyzowany tekst, na przykład tokeny 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;
}Przechowywanie przechwyconych fragmentów
Należy skopiować przechwycone poddopasowanie do obiektu std::string za pomocą str(), aby dane pozostały prawidłowe po zniszczeniu obiektu dopasowania.
#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;
}Szybkie sprawdzenie
Sprawdź swoje rozumienie indeksowania grup przechwytujących.
Podsumowanie
Poznano sposoby wyodrębniania danych za pomocą grup przechwytujących:
- nawiasy przechwytują, a
(?:...)grupuje bez przechwytywania smatch[0]oznacza całe dopasowanie, a[1]i kolejne indeksy oznaczają grupystr(),position(),length(),prefix(),suffix()sregex_iteratorprzechodzi przez każde dopasowanie
Następnie tekst będzie przekształcany za pomocą wyszukiwania i zamiany.
Często zadawane pytania
Czy lekcja „Grupy przechwytujące” jest bezpłatna?
Tak — pełny tekst „Grupy przechwytujące” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Grupy przechwytujące”?
Wyodrębniaj dopasowane fragmenty Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Grupy przechwytujące”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy regex
- Grupy przechwytujące
- Wyszukiwanie i zastępowanie
- Uwagi dotyczące wydajności