Ce face std::regex_search
Spre deosebire de regex_match, std::regex_search nu cere ca tot textul să se potrivească: caută prima porțiune care se potrivește. Cu un std::smatch afli ce s-a găsit, unde (m.position()), plus grupurile.
m.prefix() este textul de dinaintea potrivirii, iar m.suffix() cel de după. Căutând din nou în m.suffix(), găsești următoarea potrivire; pentru toate potrivirile, std::sregex_iterator este mai comod.
Parametri
| Parametru | Descriere |
|---|---|
text |
Textul în care se caută. |
rezultat |
Opțional: un std::smatch cu potrivirea găsită. |
re |
Expresia regulată. |
Ce returnează
true dacă s-a găsit o potrivire.
Exemple
Exemplul 1: Primul preț dintr-un text
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string anunt = "Vând bicicletă, preț 750 lei, negociabil. Livrare 30 lei.";
std::regex pret(R"((\d+) lei)");
std::smatch m;
if (std::regex_search(anunt, m, pret)) {
std::cout << "Găsit: " << m[0] << " la poziția " << m.position() << '\n';
std::cout << "Suma: " << m[1] << '\n';
std::cout << "După: " << m.suffix() << '\n';
}
}
Rezultat
Găsit: 750 lei la poziția 24
Suma: 750
După: , negociabil. Livrare 30 lei.
Exemplul 2: Toate potrivirile, una după alta
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string text = "Comenzi: #1024, #1031 și #1107.";
std::regex comanda(R"(#(\d+))");
std::smatch m;
while (std::regex_search(text, m, comanda)) {
std::cout << "Comanda " << m[1] << '\n';
text = m.suffix();
}
}
Rezultat
Comanda 1024
Comanda 1031
Comanda 1107
Exemplul 3: Conține un cuvânt interzis?
\b marchează granița unui cuvânt, deci „Spamul” nu este blocat, iar icase prinde și „SPAM”.
#include <iostream>
#include <regex>
#include <string>
int main() {
std::regex interzis(R"(\b(spam|reclama)\b)", std::regex::icase);
for (std::string c : {"Super articol!", "Click aici pentru SPAM gratuit", "Spamul a fost oprit"}) {
std::cout << c << ": " << (std::regex_search(c, interzis) ? "blocat" : "ok") << '\n';
}
}
Rezultat
Super articol!: ok
Click aici pentru SPAM gratuit: blocat
Spamul a fost oprit: ok
Greșeli frecvente
- Confunzi
regex_searchcuregex_matchla validări:regex_search("abc0740123456", telefon)estetrue, pentru că numărul apare undeva în text. Pentru validare foloseșteregex_matchsau ancore^...$. - În bucla cu
m.suffix()atribui sufixul aceluiași șir care este folosit dem: funcționează în exemplu pentru cămnu mai este folosit după atribuire, dar e ușor de greșit.std::sregex_iteratoreste mai sigur.
Comenzi înrudite
std::regex_match: Verifică dacă tot textul se potrivește cu modelul; std::smatch păstrează grupurile capturate.std::sregex_iterator: Parcurge una câte una toate potrivirile unei expresii regulate dintr-un std::string.std::regex_replace: Înlocuiește toate potrivirile unei expresii regulate cu alt text, care poate folosi grupurile $1, $2.std::string::find: Caută un text și returnează poziția primei (find) sau ultimei (rfind) apariții, ori npos.