Стандартные классы

В регулярных выражениях допустимы следующие основные стандартные классы (полный список смотрите в документации):

  • \d — соответствует любой цифре;
  • \w — соответствует любой букве, цифре или символу подчеркивания. По умолчанию эквивалентно: [a-zA-Z0-9_];
  • \s — любой пробельный символ (пробел, табуляция, перевод страницы, новая строка или перевод каретки);
  • \D — не цифра. Эквивалентно: [^\d];
  • \W — эквивалентно: [^\w];
  • \S — не пробельный символ. Эквивалентно: [^\s].

Следует учитывать, что стандартные классы могут зависеть от различных флагов и трактоваться гораздо шире, чем мы указали. В итоге можно получить результат, который совсем не ожидался. Советую на практике использовать только классы \s и \S, а остальные заменять явным указанием диапазона символов внутри квадратных скобок (при этом не забывайте про букву ё):

std::regex rgx("[0-9]+");      // Вместо \d
rgx = "[a-zA-Zа-яА-ЯёЁ0-9_]+"; // Вместо \w

Получим все цифры из строки:

std::regex rgx("[0-9]");
std::smatch m;
std::string str("текст123 456");
while (std::regex_search(str, m, rgx)) {
   std::cout << m.str() << ' ';
   str = m.suffix().str();
} // 1 2 3 4 5 6
std::cout << std::endl;

В этом примере мы воспользовались функцией regex_search() в сочетании с классом smatch. Метод str() класса smatch возвращает фрагмент, полностью совпадающий с шаблоном регулярного выражения, а метод suffix() — возвращает оставшийся фрагмент, в котором поиск еще не выполнялся. Чтобы найти все фрагменты, соответствующие шаблону, мы указываем функцию regex_search() в качестве условия цикла while, а внутри цикла присваиваем переменной str оставшуюся часть строки. Как только функция regex_search() вернет значение false, цикл завершится.

Если нужно получить не цифры по отдельности, а числа, то после закрывающей квадратной скобки нужно указать символ +, означающий одно или большее число вхождений символа в строку:

std::regex rgx("[0-9]+");
std::string str("текст123 456");
std::sregex_iterator istart(str.begin(), str.end(), rgx);
std::sregex_iterator iend;
while (istart != iend) {
   std::cout << istart->str() << ' ';
   ++istart;
} // 123 456 
std::cout << std::endl;

В этом примере вместо функции regex_search() мы воспользовались двумя итераторами, реализуемыми с помощью класса sregex_iterator. Хотя, если просто изменить первую строку в предыдущем примере и добавить символ +, то результат будет точно таким же.

Внутри квадратных скобок можно также использовать стандартные классы регулярных выражений формата POSIX:

  • [:alnum:] — алфавитно-цифровые символы;
  • [:w:] — аналог класса \w;
  • [:alpha:] — буквенные символы;
  • [:lower:] — строчные буквы;
  • [:upper:] — прописные буквы;
  • [:digit:] или [:d:] — десятичные цифры;
  • [:xdigit:] — шестнадцатеричные цифры;
  • [:punct:] — знаки пунктуации;
  • [:blank:] — символы табуляции и пробелов;
  • [:space:] или [:s:] — пробельные символы;
  • [:cntrl:] — управляющие символы;
  • [:print:] — печатные символы;
  • [:graph:] — печатные символы, за исключением пробела.

Получим все числа из строки:

std::regex rgx("[[:digit:]]+");
std::string str("s123 s456 789s");
std::sregex_iterator istart(str.begin(), str.end(), rgx);
std::sregex_iterator iend;
while (istart != iend) {
   std::cout << istart->str() << ' ';
   ++istart;
} // 123 456 789
std::cout << std::endl;

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов