Регулярные выражения
Для создания регулярных выражений используется класс 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"; //
if(regex_search("Total sum $100", m, price))
cout<<"sum="<<m[1].str()<<"\n"; //
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"; //
for(auto t=sregex_token_iterator(s.begin(),s.end(),price,1);
t!=sregex_token_iterator();++t)
cout<<t->str()<<"\n"; //
Для сложных строк таких как регулярные выражения, включающих много символов \, можно использовать новый вид строковой константы R"(…)":
//
std::regex re(R"(\\\/)"); //