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

Переменная matches имеет тип smatch. Буква s означает “sub.” По существу, тип smatch представляет собой вектор частичных совпадений. Первый элемент matches[0] представляет собой полное совпадение. Мы можем интерпретировать элемент matches[i] как строку, если i. Итак, если для данного регулярного выражения максимальное количество частичных шаблонов равно N, выполняется условие matches.size()==N+1.

  Что такое частичный шаблон (sub-pattern)? Можно просто сказать: “Все, что заключено в скобки внутри шаблона”. Глядя на шаблон "\\w{2}\\s*\\d{5}(–\\d{4})?", мы видим скобки вокруг четырехзначного кода ZIP. Таким образом, мы видим только один частичный шаблон, т.е. matches.size()==2. Кроме того, можно догадаться, что у нас есть простой доступ к этим четырем последним цифрам. Рассмотрим пример.

while (getline(in,line)) {

  boost::smatch matches;

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

    cout << lineno << ": " << matches[0] << '\n'; // полное

                                                  // совпадение

    if (1

      cout << "\t: " << matches[1] << '\n'; // частичное

                                            // совпадение

  }

}

Строго говоря, мы не обязаны проверять выражение 1, поскольку уже рассмотрели шаблон, но к этому нас подталкивает легкая паранойя (поскольку мы экспериментируем с разными шаблонами, хранящимися в объекте pat, и не все они содержат только один частичный шаблон). Мы можем проверить, обнаружен ли частичный шаблон, просматривая его член matched, в данном случае matches[1].matched. Нас интересует следующая ситуация: если значение matches[i].matched равно false, то частичные шаблоны matches[i], у которых нет соответствия, выводятся как пустые строки. Аналогично, если частичный шаблон не существует, например matches[17] для приведенного выше шаблона, то он рассматривается как шаблон, у которого нет соответствия.

Мы применили нашу программу к файлу, содержащему следующие строки:

address TX77845

ffff tx 77843 asasasaa

ggg TX3456–23456

howdy

zzz TX23456–3456sss ggg TX33456–1234

cvzcv TX77845–1234 sdsas

xxxTx77845xxx

TX12345–123456

Результат приведен ниже.

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

1: TX77845

2: tx 77843

5: TX23456–3456

: –3456

6: TX77845–1234

: –1234

7: Tx77845

8: TX12345–1234

: –1234

Следует подчеркнуть несколько важных моментов.

• Мы не дали себя запутать неверно отформатированным кодом ZIP в строке, начинающейся символами ggg (кстати, что в нем неправильно?).

• В строке, содержащей символы zzz, мы нашли только первый код ZIP (мы ищем только один код в строке).

• В строках 5 и 6 мы нашли правильные суффиксы.

• В строке 7 мы нашли код ZIP, скрытый среди символов xxx.

• Мы нашли (к сожалению?) код ZIP, скрытый в строке TX12345–123456.

<p id="AutBody_Root450"><strong>23.8. Синтаксис регулярных выражений</strong></p>

Мы рассмотрели довольно элементарный пример сравнения регулярных выражений. Настало время рассмотреть регулярные выражения (в форме, использованной в библиотеке regex) более полно и систематично.

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

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

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

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

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

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

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

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

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