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
\wsă 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.