Читаем Программирование полностью

  Было бы целесообразно выполнять каждый этап в строгой логической последовательности. Эта система обозначения логична и очень лаконична. Кроме того, мы не принимали проектные решения с потолка: выбранная нами система обозначений очень широко распространена. При решении большинства задач, связанных с обработкой текста, нам необходимо читать и записывать эти символы. Да, эти записи похожи на результат прогулки кошки по клавиатуре, и ошибка в единственном месте (наш лишний или пропущенный пробел) полностью изменяет их смысл, но с этим приходится смириться. Мы не можем предложить ничего радикально лучшего, и этот стиль обозначений за тридцать лет распространился очень широко. Впервые он был использован в команде grep в системе Unix, но и даже тогда его нельзя было назвать совершенно новым.

<p id="AutBody_Root449"><strong>23.7. Поиск с помощью регулярных выражений</strong></p>

Теперь применим шаблон почтовых кодов ZIP из предыдущего раздела для поиска почтовых кодов в файле. Программа определяет шаблон, а затем ищет его, считывая файл строка за строкой. Когда программа находит шаблон в какой-то строке, она выводит номер строки и найденный код.

#include

#include

#include

#include

using namespace std;

int main()

{

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

  if (!in) cerr << "нет файла \n";

  boost::regex pat ("\\w{2}\\s*\\d{5}(–\\d{4})?"); // шаблон

                                                   // кода ZIP

  cout << "шаблон: " << pat << '\n';

  int lineno = 0;

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

  while (getline(in,line)) {

    ++lineno;

    boost::smatch matches;        // записываем сюда совпавшие строки

    if (boost::regex_search(line, matches, pat))

      cout << lineno << ": " << matches[0] << '\n';

  }

}

Эта программа требует объяснений. Сначала рассмотрим следующий фрагмент:

#include

...

boost::regex pat ("\\w{2}\\s*\\d{5}(–\\d{4})?");  // шаблон кода ZIP

boost::smatch matches;           // записываем сюда совпавшие строки

if (boost::regex_search(line, matches, pat))

Мы используем реализацию библиотеки Boost.Regex, которая скоро станет частью стандартной библиотеки. Для того чтобы использовать библиотеку Boost.Regex, ее необходимо инсталлировать. Для того чтобы показать, какие возможности относятся к библиотеке Boost.Regex, мы явно указываем пространство имен boost в качестве квалификатора, т.е. boost::regex.

Вернемся к регулярным выражениям! Рассмотрим следующий фрагмент кода:

boost::regex pat ("\\w{2}\\s*\\d{5}(–\\d{4})?");

cout << "шаблон: " << pat << '\n';

Здесь мы сначала определили шаблон pat (типа regex), а затем вывели его на печать. Обратите внимание на то, что мы написали:

\\w{2}\\s*\\d{5}(–\\d{4})?

Если бы вы запустили программу, то увидели бы на экране следующую строку:

pattern: \w{2}\s*\d{5}(–\d{4})?

В строковых литералах языка С++ обратная косая черта означает управляющий символ (раздел A.2.4), поэтому вместо одной обратной косой черты (\) в литеральной строке необходимо написать две (\\).

  Шаблон типа regex на самом деле является разновидностью объекта класса string, поэтому мы можем вывести его на печать с помощью оператора <<. Класс regex — это не просто разновидность класса string, но его довольно сложный механизм сопоставления шаблонов, созданных при инициализации объекта класса regex (или при выполнении оператора присваивания), выходит за рамки рассмотрения нашей книги. Однако, поскольку мы инициализировали объект класса regex шаблоном почтовых кодов, можем применить его к каждой строке нашего файла.

boost::smatch matches;

if (boost::regex_search(line, matches, pat))

  cout << lineno << ": " << matches[0] << '\n';

  Функция regex_search(line, matches, pat) ищет в строке line любое соответствие регулярному выражению, хранящемуся в объекте pat, и если она находит какое-либо соответствие, то сохраняет его в объекте matches. Естественно, если соответствие не обнаружено, функция regex_search(line, matches, pat) возвращает значение false.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных