Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

}

while (getline(in,line)) { // проверяем строку данных

++lineno;

smatch matches;

if (!regex_match(line,matches,row))

error("неправильная строка",to_string(lineno));

}

}

Для краткости мы не привели здесь директивы

#include
. Проверяем все символы в каждой строке, поэтому вызываем функцию
regex_match
,
а не
regex_search
. Разница между ними заключается только в том, что функция
regex_match
должна сопоставлять с шаблоном каждый символ из потока ввода, а функция
regex_search
проверяет поток ввода, пытаясь найти соответствующую подстроку. Ошибочное использование функции
regex_match
, когда подразумевалось использовании функции
regex_search
(и наоборот), может оказаться самой трудно обнаруживаемой ошибкой. Однако обе эти функции используют свои совпадающие аргументы совершенно одинаково.

Теперь можем перейти к верификации данных в таблице. Мы подсчитаем количество мальчиков (“drenge”) и девочек (“piger”), учащихся в школе. Для каждой строки мы проверим, действительно ли в последнем поле (“ELEVER IALT”) записана сумму первых двух полей. Последняя строка (“Alle klasser”) содержит суммы по столбцам. Для проверки этого факта модифицируем выражение row, чтобы текстовое поле содержало частичное совпадение и можно было распознать строку “Alle klasser”.

int main

{

ifstream in("table.txt"); // входной файл

if (!in) error("Нет входного файла");

string line; // буфер ввода

int lineno = 0;

regex header( "^[\\w ]+( [\\w ]+)*$");

regex row("^([\\w ]+)(\\d+)(\\d+)( \d+)$");

if (getline(in,line)) { // проверяем строку заголовка

boost::smatch matches;

if (!boost::regex_match(line, matches, header)) {

error("Нет заголовка");

}

}

// суммы по столбцам:

int boys = 0;

int girls = 0;

while (getline(in,line)) {

++lineno;

smatch matches;

if (!regex_match(line, matches, row))

cerr << "Неправильная строка: " << lineno << '\n';

if (in.eof) cout << "Конец файла\n";

// проверяем строку:

int curr_boy = from_string<int>(matches[2]);

int curr_girl = from_string<int>(matches[3]);

int curr_total = from_string<int>(matches[4]);

if (curr_boy+curr_girl != curr_total)

error("Неправильная
сумма\n");

if (matches[1]=="Alle klasser") { // последняя строка

if (curr_boy != boys)

error("Количество мальчиков не сходится\n");

if (curr_girl != girls)

error("Количество девочек не сходится\n");

if (!(in>>ws).eof)

error("Символы после итоговой строки");

return 0;

}

// обновляем суммы:

boys += curr_boy;

girls += curr_girl;

}

error("Итоговой строки нет");

}

Последняя строка по смыслу отличается от остальных: в ней содержатся суммы. Мы распознаем ее по метке (“Alle klasser”). Мы решили, что после последнего символа не должны стоять символы, не являющиеся разделителями (для распознавания этого факта используется функция

lexical_cast
(см. раздел 23.2)), и выдаем сообщение об ошибке в случае их обнаружения.

Для того чтобы извлечь числа из полей данных, мы использовали функцию

from_string
из раздела 23.2. Мы уже проверили, что эти поля содержат только цифры, поэтому проверять правильность преобразования объекта класса
string
в переменную типа
int
не обязательно.

23.10. Ссылки

Регулярные выражения — популярный и полезный инструмент, доступный во многих языках программирования и во многих форматах. Они поддерживаются элегантной теорией, основанной на формальных языках, и эффективной технологией реализации, основанной на конечных автоматах. Описание регулярных выражений, их теории, реализации и использования конечных автоматов выходит за рамки рассмотрения настоящей книги. Однако поскольку эта тема в компьютерных науках является довольно стандартной, а регулярные выражения настолько популярны, найти больше информации при необходимости не составляет труда.

Перечислим некоторые из этих источников.

Aho, Alfred V., Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools, Second Edition (обычно называемая “The Dragon Book”). Addison-Wesley, 2007. ISBN 0321547985.

Austern, Matt, ed. “Draft Technical Report on C++ Library Extensions”. ISO/IEC DTR 19768, 2005. www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n2336.pdf.

Boost.org. Хранилище библиотек, согласованных со стандартной библиотекой языка С++. www.boost.org.

Cox, Russ. “Regular Expression Matching Can Be Simple and Fast (but Is Slow in Java, Perl, PHP, Python, Ruby, ...)”. http://swtch.com/~rsc/regexp/regexp1.html.

Maddoc, J. boost::regex documentation. www.boost.org/libs/regex/doc/index.html.

Schwartz, Randal L., Tom Phoenix, and Brian D. Foy. Learning Perl, Fourth Edition.

O’Reilly, 2005. ISBN 0596101058.

Задание

1. Выясните, является ли библиотека

regex
частью вашей стандартной библиотеки. Подсказка: ищите
std::regex
и
tr1::regex
.

Поделиться:
Популярные книги

Огненный князь

Машуков Тимур
1. Багряный восход
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Огненный князь

Тайный наследник для миллиардера

Тоцка Тала
Любовные романы:
современные любовные романы
5.20
рейтинг книги
Тайный наследник для миллиардера

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Я — Легион

Злобин Михаил
3. О чем молчат могилы
Фантастика:
боевая фантастика
7.88
рейтинг книги
Я — Легион

Изгой. Пенталогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Изгой. Пенталогия

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Бывшие. Война в академии магии

Берг Александра
2. Измены
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Бывшие. Война в академии магии

Брачный сезон. Сирота

Свободина Виктория
Любовные романы:
любовно-фантастические романы
7.89
рейтинг книги
Брачный сезон. Сирота

Отмороженный 10.0

Гарцевич Евгений Александрович
10. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный 10.0

Машенька и опер Медведев

Рам Янка
1. Накосячившие опера
Любовные романы:
современные любовные романы
6.40
рейтинг книги
Машенька и опер Медведев

Идеальный мир для Социопата 7

Сапфир Олег
7. Социопат
Фантастика:
боевая фантастика
6.22
рейтинг книги
Идеальный мир для Социопата 7

Провинциал. Книга 7

Лопарев Игорь Викторович
7. Провинциал
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Провинциал. Книга 7

LIVE-RPG. Эволюция 2

Кронос Александр
2. Эволюция. Live-RPG
Фантастика:
социально-философская фантастика
героическая фантастика
киберпанк
7.29
рейтинг книги
LIVE-RPG. Эволюция 2

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I