std::regex în C++

O expresie regulată compilată, folosită pentru verificarea, căutarea și înlocuirea textului.

Sintaxă
#include <regex>
std::regex re(R"(model)");
std::regex re(R"(model)", std::regex::icase);

Ce face std::regex

O expresie regulată este un model care descrie texte: \d+ înseamnă „una sau mai multe cifre”, [A-Z] „o literă mare”, \s „spațiu alb”, . „orice caracter”, ^ și $ începutul și sfârșitul. std::regex transformă modelul într-un obiect pe care îl folosesc std::regex_match, std::regex_search și std::regex_replace.

Modelul se scrie de obicei ca șir brut, R"(...)", ca backslash-urile să nu trebuiască dublate. Implicit se folosește sintaxa ECMAScript (ca în JavaScript). Opțiunea std::regex::icase ignoră diferența dintre litere mari și mici.

Construirea unui std::regex este costisitoare: creează-l o dată, nu în fiecare iterație a unei bucle. Un model greșit aruncă std::regex_error. Expresiile lucrează pe octeți, deci \w și [a-z] nu recunosc literele ă, î, ș, ț.

Exemple

Exemplul 1: Un model folosit de mai multe ori

#include <iostream>
#include <regex>
#include <string>

int main() {
    const std::regex cod_postal(R"(\d{6})");
    for (std::string s : {"700259", "70025", "7002590", "abc123"}) {
        std::cout << s << ": " << (std::regex_match(s, cod_postal) ? "valid" : "invalid") << '\n';
    }
}

Rezultat

700259: valid
70025: invalid
7002590: invalid
abc123: invalid

Exemplul 2: Ignorarea majusculelor și un model greșit

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::regex da(R"(da|yes)", std::regex::icase);
    std::cout << std::boolalpha << std::regex_match(std::string("DA"), da) << '\n';

    try {
        std::regex gresit(R"([0-9)");
    } catch (const std::regex_error& e) {
        if (e.code() == std::regex_constants::error_brack) {
            std::cout << "Model invalid: paranteza [ nu este închisă\n";
        }
    }
}

Rezultat

true
Model invalid: paranteza [ nu este închisă

Exemplul 3: Diacriticele și clasele de litere

[A-Za-z]+ nu acceptă „ș”, așa că „Iași” este rupt în două bucăți.

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::string text = "Iasi Iași";
    std::regex cuvant(R"([A-Za-z]+)");
    for (std::sregex_iterator it(text.begin(), text.end(), cuvant), sf; it != sf; ++it) {
        std::cout << "[" << it->str() << "] ";
    }
    std::cout << '\n';
}

Rezultat

[Iasi] [Ia] [i]

Greșeli frecvente

  • Construiești std::regex în interiorul unei bucle: compilarea modelului se repetă de fiecare dată și programul devine foarte lent.
  • Scrii modelul ca șir obișnuit: "\d+" nu compilează (secvență de escape necunoscută). Folosește "\\d+" sau, mai simplu, R"(\d+)".
  • Te aștepți ca \w să recunoască literele românești: lucrează doar cu a–z, A–Z, 0–9 și _.

Comenzi înrudite

  • std::regex_match: Verifică dacă tot textul se potrivește cu modelul; std::smatch păstrează grupurile capturate.
  • std::regex_search: Caută prima porțiune din text care se potrivește cu modelul, oriunde în text.
  • std::regex_replace: Înlocuiește toate potrivirile unei expresii regulate cu alt text, care poate folosi grupurile $1, $2.
  • std::sregex_iterator: Parcurge una câte una toate potrivirile unei expresii regulate dintr-un std::string.