Оглавление
Предисловие
Глава 1. Знакомство с регулярными выражениями
Решение реальных задач
Регулярные выражения как язык
Аналогия с файловыми шаблонами
Аналогия с языками
Регулярные выражения как особый склад ума
Для читателей, имеющих опыт работы с регулярными выражениями
Поиск в текстовых файлах: egrep
Метасимволы egrep
Начало и конец строки
Символьные классы
Один произвольный символ
Выбор
Игнорирование различий в регистре символов
Границы слов
В двух словах
Необязательные элементы
Другие квантификаторы: повторение
Круглые скобки и обратные ссылки
Экранирование
Новые горизонты
Языковая диверсификация
Смысл регулярного выражения
Дополнительные примеры
Терминология регулярных выражений
Пути к совершенствованию
Итоги
Личные заметки9
Глава 2. Дополнительные примеры
О примерах
Краткий курс Perl
Поиск по регулярному выражению
Переходим к реальным примерам
Побочные эффекты успешных совпадений
Взаимодействие регулярных выражений с логикой программы
Лирическое отступление
Модификация текста с использованием регулярных выражений
Пример: письмо на стандартном бланке
Пример: обработка биржевых котировок
Автоматизация редактирования
Маленькая почтовая утилита
Разделение разрядов числа запятыми
Преобразование текста в HTML
Задача с повторяющимися словами
Глава 3. Регулярные выражения: возможности и диалекты
История регулярных выражений
Происхождение регулярных выражений
На первый взгляд
Основные операции с регулярными выражениями
Интегрированный интерфейс
Процедурный и объектно-ориентированный интерфейс
Поиск с заменой
Поиск и замена в других языках
Итоги
Строки, кодировки и режимы
Строки как регулярные выражения
Проблемы кодировки символов
Юникод
Режимы обработки регулярных выражений и поиска совпадений
Стандартные метасимволы и возможности
Представления символов
Символьные классы и их аналоги
Якорные метасимволы и другие проверки с нулевой длиной совпадения
Комментарии и модификаторы режимов
Группировка, сохранение, условные и управляющие конструкции
Путеводитель по серьезным главам
Глава 4. Механика обработки регулярных выражений
Запустить двигатели!
Два вида двигателей
Новые стандарты
Типы механизмов регулярных выражений
С позиций избыточности
Определение типа механизма
Основы поиска совпадений
О примерах
Правило 1: более раннее совпадение выигрывает
Компоненты и части двигателя
Правило 2: квантификаторы работают максимально
Механизмы регулярных выражений
НКА: механизм, управляемый регулярным выражением
ДКА: механизм, управляемый текстом
Сравнение двух механизмов
Возврат
Крошечная аналогия
Два важных замечания
Сохраненные состояния
Возврат и максимализм
Подробнее о максимализме и о возврате
Проблемы максимализма
Многосимвольные "кавычки"
Минимальные квантификаторы
Максимальные и минимальные конструкции всегда выбирают совпадение
О сущности максимализма, минимализма и возврата
Захватывающие квантификаторы и атомарная группировка
Захватывающие квантификаторы ?+, *+, ++ и {max,min}+
Возврат при позиционной проверке
Максимальна ли конструкция выбора?
Использование упорядоченного выбора
НКА, ДКА и POSIX
"Самое длинное совпадение, ближнее к левому краю"
POSIX и правило "самого длинного совпадения, ближнего к левому краю"
Скорость и эффективность
Сравнение ДКА и НКА
Итоги
Глава 5. Практические приемы построения регулярных выражений
Балансировка регулярных выражений
Несколько коротких примеров
Снова о строках продолжения
Поиск IP-адреса
Работа с именами файлов
Поиск парных скобок
Исключение нежелательных совпадений
Поиск текста в ограничителях
Данные и предположения
Удаление пропусков в начале и конце строки
Работа с HTML
Поиск тегов HTML
Поиск ссылок HTML
Анализ HTTP URL
Проверка имени хоста
Поиск URL на практике
Нетривиальные примеры
Синхронизация
Разбор данных, разделенных запятыми
Глава 6. Построение эффективных регулярных выражений
Убедительный пример
Простое изменение - начинаем с более вероятного случая
Эффективность и правильность
Следующий шаг - локализация максимального поиска
Возвращение к реальности
Возврат с глобальной точки зрения
POSIX НКА - работа продолжается
Работа механизма при отсутствии совпадения
Уточнение
Конструкция выбора может дорого обойтись
Хронометраж
Зависимость результатов хронометража от данных
Хронометраж в языке PHP
Хронометраж в языке Java
Хронометраж в языке VB.NET
Хронометраж в языке Ruby
Хронометраж в языке Python
Хронометраж в языке Tcl
Стандартные оптимизации
Ничто не дается бесплатно
Универсальных истин не бывает
Механика применения регулярных выражений
Предварительные оптимизации
Оптимизации при смещении текущей позиции
Оптимизации на уровне регулярных выражений
Приемы построения быстрых выражений
Приемы, основанные на здравом смысле
Выделение литерального текста
Выделение якорей
Выбор между минимальными и максимальными квантификаторами
Разделение регулярных выражений
Имитация исключения по первому символу
Использование атомарной группировки и захватывающих квантификаторов
Руководство процессом поиска
Раскрутка цикла
Метод 1: построение регулярного выражения по результатам тестов
Общий шаблон "раскрутки цикла"
Метод 2: структурный анализ
Метод 3: имена хостов Интернета
Замечания
Применение атомарной группировки и захватывающих квантификаторов
Примеры раскрутки цикла
Раскрутка комментариев С
Исключение случайных совпадений
Управление поиском совпадения
Управление поиском = скорость
Свертка
Вывод: думайте!
Глава 7. Perl
Регулярные выражения как компонент языка
Самая сильная сторона Perl
Самая слабая сторона Perl
Диалект регулярных выражений Perl
Регулярные выражения - операнды и литералы
Порядок обработки литералов регулярных выражений
Модификаторы регулярных выражений
Реrl\'измы из области регулярных выражений
Контекст выражения
Динамическая видимость и последствия совпадения регулярных выражений
Специальные переменные, изменяемые при поиске
Оператор qr/…/ и объекты регулярных выражений
Построение и использование объектов регулярных выражений
Просмотр содержимого объектов регулярных выражений
Объекты регулярных выражений и повышение эффективности
Оператор поиска
Операнд регулярное выражение
Операнд целевой текст
Варианты использования оператора поиска
Интерактивный поиск - скалярный контекст с модификатором /g
Внешние связи оператора поиска
Оператор подстановки
Операнд-замена
Модификатор /e
Контекст и возвращаемое значение
Оператор разбиения
Простейшее разбиение
Возвращение пустых элементов
Специальные значения первого операнда split
Сохраняющие круглые скобки в первом операнде split
Специфические возможности Perl
Применение динамических регулярных выражений для поиска вложенных конструкций
Встроенный код
Ключевое слово local во встроенном коде
Встроенный код и переменные my
Поиск вложенных конструкций
Перегрузка литералов регулярных выражений
Ограничения перегрузки литералов регулярных выражений
Имитация именованного сохранения
Проблемы эффективности в Perl
У каждой задачи есть несколько решений
Компиляция регулярных выражений, модификатор /о, qr/…/ и эффективность
Предварительное копирование
Функция study
Хронометраж
Отладочная информация регулярных выражений
Последний комментарий
Глава 8. Java
Диалект регулярных выражений
Поддержка конструкций \p{…} и \P{…} в Java
Завершители строк Юникода
Использование пакета java.util.regex
Метод Pattern.compile()
Метод Pattern.matcher()
Объект Matcher
Применение регулярного выражения
Получение информации о результатах
Простой поиск с заменой
Расширенный поиск с заменой
Поиск с заменой по месту
Область в объекте Matcher
Объединение методов в конвейер
Методы для построения сканеров
Другие методы Matcher
Другие методы Pattern
Метод split класса Pattern с одним аргументом
Метод split класса Pattern с двумя аргументами
Дополнительные примеры
Добавление атрибутов WIDTH и HEIGHT в теги
Проверка корректности HTML-кода с использованием нескольких регулярных выражений на один объект Matcher
Разбор данных CSV
Различия между версиями Java
Различия между 1.4.2 и 1.5.0
Различия между 1.5.0 и 1.6.0
Глава 9. .NET
Диалект регулярных выражений .NET
Замечания по поводу диалекта .NET
Использование регулярных выражений в .NET
Основные принципы работы с регулярными выражениями
Общие сведения о пакете
Краткая сводка основных объектов
Основные объекты
Создание объектов Regex
Использование объектов Regex
Использование объектов Match
Использование объектов Group
Статические вспомогательные функции
Кэширование регулярных выражений
Дополнительные функции
Нетривиальные возможности .NET
Сборки регулярных выражений
Поиск вложенных конструкций
Объект Capture
Глава 10. PHP
Диалект регулярных выражений PHP
Функциональный интерфейс механизма preg
Аргумент "шаблон"
Функции preg
preg_match_all
preg_replace
preg_replace_callback
preg_split
preg_grep
preg_quote
"Недостающие" функции preg
preg_regex_to_pattern
Проверка синтаксиса неизвестного шаблона
Проверка синтаксиса неизвестного регулярного выражения
Рекурсивные регулярные выражения
Поиск совпадений с вложенными круглыми скобками
Никаких возвратов в рекурсии
Совпадение с парой вложенных скобок
Вопросы эффективности в PHP
Модификатор шаблона S: "Study"
Расширенные примеры
Разбор данных в формате CVS в PHP
Проверка тегированных данных на корректность вложенных конструкций
Алфавитный указатель