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

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

Жанры

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

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
.

Переменная

matches
имеет тип
smatch
. Буква
s
означает “sub.” По существу, тип
smatch
представляет собой вектор частичных совпадений. Первый элемент
matches[0]
представляет собой полное совпадение. Мы можем интерпретировать элемент
matches[i]
как строку, если
i<matches.size
. Итак, если для данного регулярного выражения максимальное количество частичных шаблонов равно
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<matches.size && matches[1].matched)

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

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

}

}

Строго говоря, мы не обязаны проверять выражение

1<matches.size
, поскольку уже рассмотрели шаблон, но к этому нас подталкивает легкая паранойя (поскольку мы экспериментируем с разными шаблонами, хранящимися в объекте
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.

23.8. Синтаксис регулярных выражений

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

regex
) более полно и систематично.

Регулярные выражения (regular expressions, regexps или regexs), по существу, образуют небольшой язык для выражения символьных шаблонов. Этот мощный (выразительный) и лаконичный язык иногда выглядит довольно таинственным. За десятилетия использования регулярных выражений в этом языке появилось много тонких свойств и несколько диалектов. Здесь мы опишем подмножество регулярных выражений (большое и полезное), которое, возможно, в настоящее время является наиболее распространенным диалектом (язык Perl). Если читателям понадобится более подробная информация о регулярных выражениях или возникнет необходимость объяснить их другим людям, они могут найти все, что нужно, в веб. Существует огромное количество учебников (очень разного качества) и спецификаций. В частности, в веб легко найти спецификацию
boost::regex
и ее эквивалент, принятый Комитетом по стандартизации (WG21 TR1).

Библиотека
boost::regex
поддерживает также системы обозначений языков ECMAScript, POSIX и awk, а также утилит grep и egrep. Кроме того, она содержит массу возможностей для поиска. Это может оказаться чрезвычайно полезным, особенно, если вам необходимо сравнить шаблон, описанный на другом языке. Если вам понадобятся языковые средства, которые выходят за рамки тем, которые мы описываем, поищите их самостоятельно. Однако помните, что использование как можно большего числа свойств — это не самоцель качественного программирования. При любой возможности постарайтесь сжалиться над бедным программистом, который будет эксплуатировать вашу программу (возможно, им окажетесь вы сами через несколько месяцев), читать ее и пытаться разобраться в вашем коде: код следует писать так, чтобы он не был заумным без особой причины и не содержал малопонятных мест.

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

Столичный доктор. Том III

Вязовский Алексей
3. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том III

Бремя империи

Афанасьев Александр
Бремя империи - 1.
Фантастика:
альтернативная история
9.34
рейтинг книги
Бремя империи

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Герцогиня в ссылке

Нова Юлия
2. Магия стихий
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Герцогиня в ссылке

Помещица Бедная Лиза

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Помещица Бедная Лиза

Менталист. Конфронтация

Еслер Андрей
2. Выиграть у времени
Фантастика:
боевая фантастика
6.90
рейтинг книги
Менталист. Конфронтация

В теле пацана 4

Павлов Игорь Васильевич
4. Великое плато Вита
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
В теле пацана 4

Я уже князь. Книга XIX

Дрейк Сириус
19. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я уже князь. Книга XIX

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

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

Пистоль и шпага

Дроздов Анатолий Федорович
2. Штуцер и тесак
Фантастика:
альтернативная история
8.28
рейтинг книги
Пистоль и шпага

Гром над Империей. Часть 1

Машуков Тимур
5. Гром над миром
Фантастика:
фэнтези
5.20
рейтинг книги
Гром над Империей. Часть 1

Ночь со зверем

Владимирова Анна
3. Оборотни-медведи
Любовные романы:
любовно-фантастические романы
5.25
рейтинг книги
Ночь со зверем

Везунчик. Проводник

Бубела Олег Николаевич
3. Везунчик
Фантастика:
фэнтези
6.62
рейтинг книги
Везунчик. Проводник

Шесть тайных свиданий мисс Недотроги

Суббота Светлана
Любовные романы:
любовно-фантастические романы
эро литература
7.75
рейтинг книги
Шесть тайных свиданий мисс Недотроги