Метасимволы

Перечислим метасимволы, применяемые в регулярных выражениях:

  • ^ — привязка к началу строки;
  • $ — привязка к концу строки;
  • [] — позволяет указать символы, которые могут встречаться на этом месте в строке. Можно перечислять символы подряд или указать диапазон через тире;
  • [^] — позволяет указать символы, которые не могут встречаться на этом месте в строке. Можно перечислять символы подряд или указать диапазон через тире;
  • n|m — соответствует одному из фрагментов n или m:
// красная или красное, но не красный
std::regex rgx("красн((ая)|(ое))");
  • . (точка) — любой символ, кроме символа перевода строки (\n). Внутри квадратных скобок точка не имеет специального значения. Если нужно найти соответствие любому символу, включая символ перевода строки, то можно воспользоваться следующим кодом: [\s\S]. Класс \s означает любой пробельный символ, а класс \S — любой не пробельный символ. Пример:
std::regex rgx("^.+$");
std::cout << std::regex_search("10\n20", rgx) << std::endl; // 0
rgx = R"...(^[\s\S]+$)...";
std::cout << std::regex_search("10\n20", rgx) << std::endl; // 1

Привязку к началу и концу строки следует использовать, если строка должна полностью соответствовать регулярному выражению. Например, проверим, содержит ли строка только число:

std::regex rgx("^[0-9]+$");
std::cout << std::regex_match("2", rgx) << std::endl;  // 1
std::cout << std::regex_match("s2", rgx) << std::endl; // 0

Так как функция regex_match() проверяет полное соответствие строки шаблону, символы привязки к началу и концу строки (^ и $) в шаблоне можно не указывать, но так выглядит нагляднее. Если мы используем другие функции, например, regex_search(), то символы становятся важными. В этом примере, не указав привязку к началу и концу, мы получим соответствие шаблону любого числа внутри строки:

std::regex rgx("^[0-9]+$");
std::cout << std::regex_search("2", rgx) << std::endl;  // 1
std::cout << std::regex_search("s2", rgx) << std::endl; // 0
rgx = "[0-9]+";
std::cout << std::regex_search("s2", rgx) << std::endl; // 1

Если убрать привязку, то любая строка, содержащая хотя бы одну цифру, будет соответствовать шаблону [0–9]+:

std::regex rgx("[0-9]+");
std::cmatch m;
std::cout << std::regex_search("s245", m, rgx) << std::endl; // 1
if (!m.empty()) {
   std::cout << m[0] << std::endl; // 245
}

В этом примере мы не только проверили соответствие шаблону, но и получили найденное число, указав во втором параметре функции regex_search() объект класса cmatch. Если поиск закончился удачно, то метод empty() вернет значение false. Чтобы получить найденный фрагмент указываем индекс внутри квадратных скобок. Индекс 0 соответствует полному совпадению с шаблоном, а последующие индексы — фрагментам, заключенным внутри шаблона в круглые скобки (при наличии групп в шаблоне).

Можно указать привязку только к началу или только к концу строки:

std::regex rgx("^[0-9]+");
std::cmatch m;
std::regex_search("123Строка245", m, rgx);
if (!m.empty()) std::cout << m[0] << std::endl; // 123

В этом примере мы получили только первое число, которое расположено в начале строки, так как указана привязка к началу строки. Если указать привязку только к концу строки, то получим только последнее число:

std::regex rgx("[0-9]+$");
std::cmatch m;
std::regex_search("123Строка245", m, rgx);
if (!m.empty()) std::cout << m[0] << std::endl; // 245

В квадратных скобках [] можно указать символы, которые могут встречаться на этом месте в строке. Можно перечислять символы подряд или указать диапазон через тире:

  • [09] — соответствует цифре 0 или 9;
  • [0-9] — соответствует любой цифре от 0 до 9;
  • [абв] — соответствует буквам а, б и в;
  • [а-г] — соответствует буквам а, б, в и г;
  • [а-яё] — соответствует любой букве от а до я;
  • [АБВ] — соответствует буквам А, Б и В;
  • [А-ЯЁ] — соответствует любой букве от А до Я;
  • [а-яА-ЯёЁ] — соответствует любой русской букве в любом регистре;
  • [0-9а-яА-ЯёЁa-zA-Z] — любая цифра и любая русская или английская буква независимо от регистра.
Обратите внимание!

Значение можно инвертировать, если после первой скобки указать символ ^. Таким образом можно указать символы, которых не должно быть на этом месте в строке:

  • [^09] — не цифра 0 или 9;
  • [^0-9] — не цифра от 0 до 9;
  • [^а-яА-ЯёЁa-zA-Z] — не русская или английская буква в любом регистре.

Как вы уже знаете, точка теряет свое специальное значение, если ее заключить в квадратные скобки. Кроме того, внутри квадратных скобок могут встретиться символы, которые имеют специальное значение (например, ^ и -). Символ ^ теряет свое специальное значение, если он не расположен сразу после открывающей квадратной скобки:

std::regex rgx("[09^]");     // 0, 9 или ^

Чтобы отменить специальное значение символа -, его необходимо указать после перечисления всех символов, перед закрывающей квадратной скобкой:

std::regex rgx("[09-]");     // 0, 9 или -

Все специальные символы можно сделать обычными, если перед ними указать символ \:

std::regex rgx(R"([0\-9])"); // 0, - или 9

Обратите внимание: мы добавили один символ \ только потому, что использовали raw-строку, в обычной строке символов должно быть два:

std::regex rgx("[0\\-9]");   // 0, - или 9

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

Помощь сайту

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

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