std::regex_search în C++

Caută prima porțiune din text care se potrivește cu modelul, oriunde în text.

Sintaxă
#include <regex>
bool regex_search(const std::string& text, const std::regex& re);
bool regex_search(const std::string& text, std::smatch& rezultat, const std::regex& re);

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_search cu regex_match la validări: regex_search("abc0740123456", telefon) este true, pentru că numărul apare undeva în text. Pentru validare folosește regex_match sau ancore ^...$.
  • În bucla cu m.suffix() atribui sufixul aceluiași șir care este folosit de m: funcționează în exemplu pentru că m nu mai este folosit după atribuire, dar e ușor de greșit. std::sregex_iterator este 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.