printSTL

printРегулярные выражения

Для создания регулярных выражений используется класс regex. В первом аргументе конструктора указывается строка, во втором аргументе – тип регулярного выражения (POSIX, awk, grep, ECMA-262), режим оптимизации, чувствительность к регистру и т.п. Для обработки строк используются следующие функции:
  • regex_match – проверка соответствия строки регулярному выражению, результат сопоставления может быть помещен в объект класса smatсh или cmatch в зависимости от типа первого аргумента (string или char *), 0-й уровень соответствует всему выражению, `i`-й – подвыражению в `i`-х скобках;
  • regex_search – поиск первой подстроки, соответствующей регулярному выражению, аналогично можно получить результат сопоставления; для обработки всех подстрок для string используются итераторы sregex_iterator и sregex_token_iterator (если необходима обработка подвыражений определенного уровня), а для char * – cregex_iterator и cregex_token_iterator, итератор указывает на результат сопоставления;
  • regex_replace – замена подстрок, соответствующим регулярному выражению.
regex price("\\$(([0-9]+)(\\.([0-9]+))?)");
cmatch m;
if(regex_match("$0.99", price)) 
  cout<<"OK\n";
if(regex_match("$3.25", m, price)) 
  cout<<m.str(2)<<" dollars "<<m.str(4)<<" cents\n"; // 3 dollars 25 cents
if(regex_search("Total sum $100", m, price)) 
  cout<<"sum="<<m[1].str()<<"\n"; // sum=100
string s("Prices are from $75 to $80");
for(auto t=sregex_iterator(s.begin(),s.end(),price);
         t!=sregex_iterator();++t)
  cout<<t->str()<<"\n"; // $75 $80
for(auto t=sregex_token_iterator(s.begin(),s.end(),price,1);
         t!=sregex_token_iterator();++t)
  cout<<t->str()<<"\n"; // 75 80
Для сложных строк таких как регулярные выражения, включающих много символов \, можно использовать новый вид строковой константы R"(…)":
// Регулярное выражение для поиска \/
std::regex re(R"(\\\/)"); // вместо "\\\\\\/"
loading