Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ПИ_ИКТ Программирование по С++ (1 семестр) _Хотов.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
5.83 Mб
Скачать

Небольшое отступление от алгоритма, для описания его параметров. Эти параметры используются во всех алгоритмах, но рассмотрим их только здесь.

[Флаги] — необязательный параметр, с дефолтовым значением match_default. Про доступные флаги, можно посмотреть здесь. Флаги комбинируются посредством '|'(or).

Partial match

Частичное соответсвие необходимо для проверки входной строки, на частичное соответсвие регулярному выражению. Это может быть полезным при валидации поступающих асинхронно данных или при больших объемах данных, т.е в тех случаях когда в конкретный момент времени нет возможности провести полное соответсвие между регулярным выражением и исходной строкой. Чтобы использовать partial match, необходимо передать флаг match_partial в [флаги]. При этом, если используется частичное соответствие, то используемый алгоритм(regex_match, regex_search etc.) вернет true, но флаг matched у нулевого элеменат match_results будет уставновлен в false. То, что было найдено в результате частичного соответствия, можно получить через этот же нулевой элемент. Пример использования:

std::string xStr("AAAA-12222");

boost::regex xRegEx("(\\w+)-(\\d+)-(\\w+)-(\\d+)");

boost::smatch xResults;

std::cout << "===================Results================= \n";

std::cout << "Does this line match the regex? " << std::boolalpha << boost::regex_match(xStr, xResults, xRegEx, boost::match_default | boost::match_partial) << "\n";

std::cout << "Is it the partial match? " << std::boolalpha << !xResults[0].matched << "\nPrint the partial match:\n" << xResults[0] << std::endl; * This source code was highlighted with Source Code Highlighter.

Вывод:

=====================Results=========================

Does this line match the regex? true

Is it the partial match? true

Print the partial match: AAAA-12222

regex_search

Данный алгоритм предназначен для поиска подстроки в исходной строке, по заданному регулярному выражению. Формат использования выглядит следующим образом: regex_search(входящая_строка, [результаты_нахождения_соответствий], регулярное_выражение, [флаги]). Пример использования:

std::string xStr("The boost library has a great opportunity for the regex!");

boost::regex xRegEx("\\b(?:\\w+?)((\\w)\\2)(?:\\w+?)\\b");

boost::smatch xResults;

std::cout << "==========================Results============================== \n";

std::string::const_iterator xItStart = xStr.begin();

std::string::const_iterator xItEnd = xStr.end();

while( boost::regex_search(xItStart, xItEnd, xResults, xRegEx) )

{

std::cout << "Word, we've searched, is \"" << xResults[0] << "\". It has two \"" << xResults[2] << "\" inside itself.\n";

xItStart = xResults[1].second;

} * This source code was highlighted with Source Code Highlighter.

Вывод:

==========================Results============================== Word, we've searched, is «boost». It has two «o» inside itself. Word, we've searched, is «opportunity». It has two «p» inside itself.

regex_replace

Алгоритм используется для замены всех вхождений подстрок, соответсвующих регулярному выражению, на строку заданному в определенном формате. Результат может быть получен через итератор, переданный в качестве аргумента либо как возращаемая строка. Части сроки которые не соответствуют регулярному выражению, копируются в выходнуб строку не измененными, если не задан флаг format_no_copy, который оставляет только заматченные строки в результате. При переданном флаге format_first_only, заменяется только первая подстрока, соответствующая регулярному выражению. Типично используемый формат: regex_replace (входящая_строка, регулярное_выражение, форматная_строка, [флаги]). форматная_строка определяет строку, на которую будет заменятся найденная подстрока. Она может подчинятся одному из следующих правил синтаксиса:

  • sed флаг:format_sed

  • Perl(по умолчанию) флаг:format_perl

  • Boost-extended флаг:format_all

  • Литеральный, т.е не использует никаких специальных символов. Флаг:format_literal

Пример использования:

std::string xStr("AAAA-12222-BBBBB-44455");

boost::regex xRegEx("(\\w+)-(\\d+)-(\\w+)-(\\d+)");

std::string xFormatString("$1*$2*$3*$4");

boost::smatch xResults;

std::cout << "=================Results=================== \n";

std::cout << "Print string after replace:\n " << boost::regex_replace(xStr, xRegEx, xFormatString, boost::match_default | boost::format_perl) << std::endl; * This source code was highlighted with Source Code Highlighter.

Вывод:

====================Results===========================

Print string after replace: AAAA*12222*BBBBB*44455