Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Метасимволы
Перечислим метасимволы, применяемые в регулярных выражениях:
^
— привязка к началу строки;$
— привязка к концу строки;[]
— позволяет указать символы, которые могут встречаться на этом месте в строке. Можно перечислять символы подряд или указать диапазон через тире;[^]
— позволяет указать символы, которые не могут встречаться на этом месте в строке. Можно перечислять символы подряд или указать диапазон через тире;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]
— любая цифра и любая русская или английская буква независимо от регистра.
ё
не входит в диапазон [а-я]
. Чтобы буква входила в диапазон нужно при создании шаблона указать флаг collate
или просто добавить букву ё
в шаблон: [а-яё]
.Значение можно инвертировать, если после первой скобки указать символ ^
. Таким образом можно указать символы, которых не должно быть на этом месте в строке:
[^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
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов