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

Вспомогательные средства

regex_iterator

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

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

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

boost::smatch xResults;

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

boost::sregex_iterator xIt(xStr.begin(), xStr.end(), xRegEx);

boost::sregex_iterator xInvalidIt;

while(xIt != xInvalidIt)

std::cout << *xIt++ << "*";

* This source code was highlighted with Source Code Highlighter.

Вывод:

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

AAAA*12222*BBBBB*44455*

regex_token_iterator

Очень полезный интрумент для разбиения строки на токены, Формат использования: regex_token_iterator(начальный_итератор, конечный _итератор, регулярное_выражение, [submatch]) [submatch] используется для указания, как следует интерпретировать токены в строке. При -1 итератор возвращает часть последовательности, которая не соответствует регулярному выражению. Т.е возвращается либо строка, которая идет после первого совпадения, до начала следующего совпадения(не включая первый символ совпадения). Либо, с начала строки, если начала строки не удовлетворяет регулярному выражению. Т.е при передаче -1, регулярное выражения является разделителем. При 0, каждое смещение итератора(++) дает следующую часть строки которая была “заматчена“, т.е каждый разыменованный итератор является capture строки. При любом положительном числе, в качестве параметра, выбирается capture регулярного выражения соответствующий числу, переданному в качестве параметра. Так же можно передать массив индексов в качестве параметра, тогда итератор будет искать каждый capture согласно индексам в массиве, т.е если массив состоит из {4, 2, 1}, тогда начальный итератор будет указывать на 4 capture, следующий итератор на 2 и т.д. Процесс будет повторятся для всей последовательности, пока не закончатся соответствия для данного регулярного выражения. По дефолту это параметр равен 0. Разыменованный итератор является объектом класса sub_match. Примеры использования:

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

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

boost::smatch xResults;

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

boost::sregex_token_iterator xItFull(xStr.begin(), xStr.end(), xRegEx, 0);

boost::sregex_token_iterator xInvalidIt;

std::cout << "Result the same as the regex_iterator: \n";

while(xItFull != xInvalidIt)

std::cout << *xItFull++ << "*";

//Parts of captures

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

boost::sregex_token_iterator xItFirstCapture(xStr.begin(), xStr.end(), xRegEx2, 1);

std::cout << "\nShow only first captures: \n";

while(xItFirstCapture != xInvalidIt)

std::cout << *xItFirstCapture++ << "*";

//Reverse order

int aIndices[] = {2,1};

boost::sregex_token_iterator xItReverseCapture(xStr.begin(), xStr.end(), xRegEx2, aIndices);

std::cout << "\nShow captures in the reverse order: \n";

while(xItReverseCapture != xInvalidIt) std::cout << *xItReverseCapture++ << "*"; //Delimiters

boost::regex xRegEx3("(\\w|\\d)+");

boost::sregex_token_iterator xItDelimiters(xStr.begin(), xStr.end(), xRegEx3, -1);

std::cout << "\nShow delimiters: \n";

while(xItDelimiters != xInvalidIt)

std::cout << *xItDelimiters++ << " "; * This source code was highlighted with Source Code Highlighter.

Вывод:

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

Result the same as the regex_iterator: AAAA*12222*BBBBB*44455*

Show only first captures: AAAA*BBBBB*

Show captures in the reverse order: 12222*AAAA*44455*BBBBB*

Show delimiters: — — -

Замечание

Любой алгоритм может выбросить исключение типа std::runtime_error в случае если сложность проверки полного соответствия(matching) N элементов начнет превышать О(N^2) или в случае переполнения стека(если Boost.Regex был собран в рекурсивном режиме)

Лабораторная работа № 33. BOOST::REGEX. Регулярные выражения

Цель работы:

Овладеть навыками обработки строк с помощью регулярных выражений с использованием библиотеки BOOST.

Порядок выполнения работы

Решить задачи с использованием библиотеки BOOST.

Задание

Дана строка, в которой содержится осмысленное текстовое сообщение. Слова сообщения разделяются пробелами и знаками препинания.

  1. Определите, содержится ли в сообщении заданное слово.

  2. Выведите все слова заданной длины.

  3. Выведите на экран все слова сообщения, записанные с заглавной буквы.

  4. Удалите из сообщения все однобуквенные слова.

  5. Удалите из сообщения все знаки препинания.

  6. Удалите из сообщения все русские слова.

  7. Удалите из сообщения только те русские слова, которые начинаются на гласную букву.

  8. Заменить все английские слова на многоточие.

  9. Найти максимальное целое число, встречающееся в сообщении.

  10. Найти сумму всех имеющихся в тексте чисел (целых и вещественных, причем вещественное число может быть записано в экспоненциальной форме).

  11. В сообщении могут встречаться номера телефонов, записанные в формате xx-xx-xx, xxx-xxx или xxx-xx-xx. Вывести все номера телефонов, которые содержатся в сообщении.

  12. В сообщении может содержаться дата в формате дд.мм.гггг. В заданном формате дд – целое число из диапазона от 1 до 31, мм – целое число из диапазона от 1 до 12, а гггг – целое число из диапазона от 1900 до 2010 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Выведите на экран все даты, которые относятся к текущему году.

  13. В сообщении могут содержаться IP-адреса компьютеров в формате d.d.d.d, где d – целое число из диапазона от 0 до 255. Вывести все IP-адреса содержащиеся в тексте.

  14. В сообщении могут содержаться IP-адреса компьютеров в формате d.d.d.d, где d – целое число из диапазона от 0 до 255. Удалить из сообщения IP-адреса, в которых последнее число d начинается с заданной цифры (данная цифра вводится с клавиатуры).

  15. Выведите на экран все адреса web-сайтов, содержащиеся в сообщении.

  16. В сообщении может содержаться дата в формате дд.мм.гггг. В заданном формате дд – целое число из диапазона от 1 до 31, мм – целое число из диапазона от 1 до 12, а гггг – целое число из диапазона от 1900 до 2010 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Замените каждую дату сообщения на дату следующего дня.

  17. В сообщении может содержаться дата в формате дд.мм.гггг. В заданном формате дд – целое число из диапазона от 1 до 31, мм – целое число из диапазона от 1 до 12, а гггг – целое число из диапазона от 1900 до 2010 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Замените каждую дату в сообщении на дату предыдущего дня.

  18. В сообщении может содержаться время в формате чч:мм:сс. В заданном формате чч – целое число из диапазона от 00 до 24, мм и сс – целые числа из диапазона от 00 до 60 (если какая-то часть формата нарушена, то данная подстрока в качестве даты не рассматривается). Преобразуйте каждое время к формату чч:мм, применив правило округления до целого числа минут.