Регулярные выражения

Поделись знанием:
Перейти к: навигация, поиск

Регуля́рные выраже́ния (англ. regular expressions) — формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (символов-джокеров, англ. wildcard characters). Для поиска используется строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска. Для манипуляций с текстом дополнительно задаётся строка замены, которая также может содержать в себе специальные символы.





Содержание

Возможности

Регулярные выражения произвели прорыв в электронной обработке текстов в конце XX века.К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3052 дня] Набор утилит (включая редактор sed и фильтр grep), поставляемых в дистрибутивах UNIX, одним из первых способствовал популяризации регулярных выражений для обработки текстов. Многие современные языки программирования имеют встроенную поддержку регулярных выражений. Среди них ActionScript, Perl, Java[1],PHP, JavaScript, языки платформы .NET Framework[2], Python, Tcl, Ruby, Lua, Gambas, C++ (стандарт 2011 года), Delphi, D, Haxe и другие.

Регулярные выражения используются некоторыми текстовыми редакторами и утилитами для поиска и подстановки текста. Например, при помощи регулярных выражений можно задать шаблоны, позволяющие:

  • найти все последовательности символов «кот» в любом контексте, как то: «кот», «котлета», «терракотовый»;
  • найти отдельно стоящее слово «кот» и заменить его на «кошка»;
  • найти слово «кот», которому предшествует слово «персидский» или «чеширский»;
  • убрать из текста все предложения, в которых упоминается слово кот или кошка.

Регулярные выражения позволяют задавать и гораздо более сложные шаблоны поиска или замены.

Результатом работы с регулярным выражением может быть:

  • проверка наличия искомого образца в заданном тексте;
  • определение подстроки текста, которая сопоставляется образцу;
  • определение групп символов, соответствующих отдельным частям образца.

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

История

Истоки регулярных выражений лежат в теории автоматов, теории формальных языков и классификации формальных грамматик по Хомскому[3].

Эти области изучают вычислительные модели (автоматы) и способы описания и классификации формальных языков. В 1940-х гг. Уоррен Маккалок и Уолтер Питтс описали нейронную систему, используя простой автомат в качестве модели нейрона.

Математик Стивен Клини позже описал эти модели, используя свою систему математических обозначений, названную «регулярные множества».

Кен Томпсон встроил их в редактор QED, а затем в редактор ed под UNIX. С этого времени регулярные выражения стали широко использоваться в UNIX и UNIX-подобных утилитах, например в expr, awk, Emacs, vi, lex и Perl.

Регулярные выражения в Perl и Tcl происходят от реализации, написанной Генри Спенсером. Филип Хейзел разработал библиотеку PCRE (англ. Perl-compatible regular expressions — Perl-совместимые регулярные выражения), которая используется во многих современных инструментах, таких как PHP и Apache.

В теории формальных языков

Регулярные выражения состоят из констант и операторов, которые определяют множества строк и множества операций на них соответственно. На данном конечном алфавите Σ определены следующие константы:

и следующие операции:

  • (сцепление, конкатенация) RS обозначает множество {αβ | α ∈ R & β ∈ S}. Например, {"boy", "girl"}{"friend", "cott"} = {"boyfriend", "girlfriend", "boycott", "girlcott"}.
  • (дизъюнкция, чередование) R|S обозначает объединение R и S. Например, {"ab", "c"}|{"ab", "d", "ef"} = {"ab", "c", "d", "ef"}.[4]
  • (замыкание Клини, звезда Клини) R* обозначает минимальное надмножество множества R, которое содержит ε и замкнуто относительно конкатенации. Это есть множество всех строк, полученных конкатенацией нуля или более строк из R. Например, {"Run", «Forrest»}* = {ε, «Run», «Forrest», «RunRun», «RunForrest», «ForrestRun», «ForrestForrest», «RunRunRun», «RunRunForrest», «RunForrestRun», …}.

Синтаксис

Представление символов

Обычные символы (литералы) и специальные символы (метасимволы)

Большинство символов в регулярном выражении представляют сами себя за исключением специальных символов [ ] \ / ^ $ . | ? * + ( ) { } (в разных типах регулярных выражений этот набор различается, см. Разновидности регулярных выражений), которые могут быть экранированы символом \ (обратная косая черта) для представления самих себя в качестве символов текста. Можно экранировать целую последовательность символов, заключив её между \Q и \E.

Пример Соответствие
a\.? a. или a
a\\\\b a\\b
a\[F\] a[F]
\Q+-*/\E +-*/

Аналогично могут быть представлены другие специальные символы (набор символов, требующих экранирования, может отличаться в зависимости от конкретной реализации). Часть символов, которые в той или иной реализации не требуют экранирования (например, угловые скобки < >), могут быть экранированы из соображений удобочитаемости.

Любой символ

Метасимвол . (точка) означает один любой символ, но в некоторых реализациях исключая символ новой строки.

Вместо символа . можно использовать [\s\S] (все пробельные и непробельные символы, включая символ новой строки).

Символьные классы (наборы символов)

Набор символов в квадратных скобках [ ] именуется символьным классом и позволяет указать интерпретатору регулярных выражений, что на данном месте в строке может стоять один из перечисленных символов. В частности, [абв] задаёт возможность появления в тексте одного из трёх указанных символов, а [1234567890] задаёт соответствие одной из цифр. Возможно указание диапазонов символов: например, [А-Яа-я] соответствует всем буквам русского алфавита, за исключением букв «Ё» и «ё».[5]

Если требуется указать символы, которые не входят в указанный набор, то используют символ ^ внутри квадратных скобок, например [^0-9] означает любой символ, кроме цифр.

Добавление в набор специальных символов путём экранирования — самый бесхитростный способ. Однако в современных регулярных выражениях унаследован также и традиционный подход — см. Традиционные регулярные выражения.

Некоторые символьные классы можно заменить специальными метасимволами:

Символ Эквивалент Соответствие
\d [0-9] Цифровой символ
\D [^0-9] Нецифровой символ
\s [ \f\n\r\t\v] Пробельный символ
\S [^ \f\n\r\t\v] Непробельный символ
\w [[:word:]] Буквенный или цифровой символ или знак подчёркивания
\W [^[:word:]] Любой символ, кроме буквенного или цифрового символа или знака подчёркивания

Позиция внутри строки

Следующие символы позволяют спозиционировать регулярное выражение относительно элементов текста: начала и конца строки, границ слова.

Представление Позиция Пример Соответствие
^ Начало текста (или строки при модификаторе ?m) ^a aaa aaa
$ Конец текста (или строки при модификаторе ?m) a$ aaa aaa
\b Граница слова a\b aaa aaa
\ba aaa aaa
\B Не граница слова \Ba\B aaa aaa
\G Предыдущий успешный поиск \Ga aaa aaa (поиск остановился на 4-й позиции — там, где не нашлось a)

Обозначение группы

Круглые скобки используются для определения области действия и приоритета операций. Шаблон внутри группы обрабатывается как единое целое и может быть квантифицирован. Например, выражение (тр[ау]м-?)* найдёт последовательность вида трам-трам-трумтрам-трум-трамтрум.

Перечисление

Вертикальная черта разделяет допустимые варианты. Например, gray|grey соответствует gray или grey. Следует помнить, что перебор вариантов выполняется слева направо, как они указаны.

Если требуется указать перечень вариантов внутри более сложного регулярного выражения, то его нужно заключить в группу. Например, gray|grey или gr(a|e)y описывают строку gray или grey. В случае с односимвольными альтернативами предпочтителен вариант gr[ae]y, так как сравнение с символьным классом выполняется проще, чем обработка группы с проверкой на все её возможные модификаторы и генерацией обратной связи.

Квантификация (поиск последовательностей)

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

Представление Число повторений Эквивалент Пример Соответствие
? Ноль или одно {0,1} colou?r color, colour
* Ноль или более {0,} colou*r color, colour, colouur и т. д.
+ Одно или более {1,} colou+r colour, colouur и т. д. (но не color)
Представление Число повторений Пример Соответствие
{n} Ровно n раз colou{3}r colouuur
{m,n} От m до n включительно colou{2,4}r colouur, colouuur, colouuuur
{m,} Не менее m colou{2,}r colouur, colouuur, colouuuur и т. д.
{,n} Не более n colou{,3}r color, colour, colouur, colouuur

Часто используется последовательность .* для обозначения любого количества любых символов между двумя частями регулярного выражения.

Символьные классы в сочетании с квантификаторами позволяют устанавливать соответствия с реальными текстами. Например, столбцами цифр, телефонами, почтовыми адресами, элементами HTML-разметки и др.

Если символы { } не образуют квантификатор, их специальное значение игнорируется.

Жадная и ленивая квантификация

Пример использования жадных и ленивых выражений

Выражение (<.*>) соответствует строке, содержащей несколько тегов HTML-разметки, целиком.

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

Чтобы выделить отдельные теги, можно применить ленивую версию этого выражения: (<.*?>) Ей соответствует не вся показанная выше строка, а отдельные теги (выделены цветом):

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

В некоторых реализациях квантификаторам в регулярных выражениях соответствует максимально длинная строка из возможных (квантификаторы являются жадными, англ. greedy). Это может оказаться значительной проблемой. Например, часто ожидают, что выражение (<.*>) найдёт в тексте теги HTML. Однако если в тексте есть более одного HTML-тега, то этому выражению соответствует целиком строка, содержащая множество тегов.

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

Эту проблему можно решить двумя способами.

  1. Учитывать символы, не соответствующие желаемому образцу (<[^>]*> для вышеописанного случая).
  2. Определить квантификатор как нежадный (ленивый, англ. lazy) — большинство реализаций позволяют это сделать, добавив после него знак вопроса.

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

Жадный Ленивый
* *?
+ +?
{n,} {n,}?

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

Ревнивая квантификация (Сверхжадная)

При поиске выражения (a+a+)+a в строке aaaaa интерпретатор пойдёт приблизительно по следующему пути:

  1. aaaaa
  2. aaaa
  3. aaaaa
  4. aaa
  5. aaaaa
  6. aaaa
  7. aaaaa — и только тут, проверив все точки возврата, остановится.

При использовании ревнивого квантификатора будет выполнен только первый шаг алгоритма.

В отличие от обычной (жадной) квантификации, ревнивая (possessive) квантификация не только старается найти максимально длинный вариант, но ещё и не позволяет алгоритму возвращаться к предыдущим шагам поиска для того, чтобы найти возможные соответствия для оставшейся части регулярного выражения.

Использование квантификаторов увеличивает скорость поиска, особенно в тех случаях, когда строка не соответствует регулярному выражению. Кроме того, ревнивые квантификаторы могут быть использованы для исключения нежелательных совпадений.

Жадный Ревнивый
* *+
? ?+
+ ++
{n,} {n,}+
Пример Соответствие
ab(xa)*+a abxaabxaa; но не abxaabxaa, так как буква a уже занята

Это аналогично атомарной группировке.

Группировка

Обратная связь

Одно из применений группировки — повторное использование ранее найденных групп символов (подстрок, блоков, отмеченных подвыражений, захватов). При обработке выражения подстро́ки, найденные по шаблону внутри группы, сохраняются в отдельной области памяти и получают номер, начиная с единицы. Каждой подстроке соответствует пара скобок в регулярном выражении. Квантификация группы не влияет на сохранённый результат, то есть, сохраняется лишь первое вхождение. Обычно поддерживается до 9 нумерованных подстрок с номерами от 1 до 9, но некоторые интерпретаторы позволяют работать с бо́льшим количеством. Впоследствии в пределах данного регулярного выражения можно использовать обозначения от \1 до \9 для проверки на совпадение с ранее найденной подстрокой.

Например, регулярное выражение (та|ту)-\1 найдёт строку та-та или ту-ту, но пропустит строку та-ту.

Также ранее найденные подстро́ки можно использовать при замене по регулярному выражению. В таком случае в замещающий текст вставляются те же обозначения, что и в пределах самого выражения.

Группировка без обратной связи

Если группа используется только для группировки и её результат в дальнейшем не потребуется, то можно использовать группировку вида (?:шаблон). Под результат такой группировки не выделяется отдельная область памяти и, соответственно, ей не назначается номер. Это положительно влияет на скорость выполнения выражения, но понижает удобочитаемость.

Атомарная группировка

Атомарная группировка вида (?>шаблон) так же, как и группировка без обратной связи, не создаёт обратных связей. В отличие от неё, такая группировка запрещает возвращаться назад по строке, если часть шаблона уже найдена.

Пример Соответствие Создаваемые группы
a(bc|b|x)cc abccaxcc

abccaxcc

abccaxcc

abccaxcc

a(?:bc|b|x)cc abccaxcc, abccaxcc нет
a(?>bc|b|x)cc abccaxcc

но не abccaxcc: вариант x найден, остальные проигнорированы

нет
a(?>x*)xa не найдётся axxxa: все x заняты, и нет возврата внутрь группы

Атомарная группировка выполняется ещё быстрее, чем группировка без обратной связи, и сохраняет процессорное время при выполнении остального выражения, так как запрещает проверку любых других вариантов внутри группы, когда один вариант уже найден. Это очень полезно при оптимизации групп со множеством различных вариантов.

Это аналогично ревнивой квантификации.

Модификаторы

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

Синтаксис Описание
(?i) Включает нечувствительность выражения к регистру символов (англ. case insensitivity)
(?-i) Выключает
(?s) Включает режим соответствия точки символам переноса строки и возврата каретки
(?-s) Выключает
(?m) Символы ^ и $ вызывают соответствие только после и до символов новой строки
(?-m) с началом и концом текста
(?x) Включает режим без учёта пробелов между частями регулярного выражения и позволяет использовать # для комментариев
(?-x) Выключает

Группы-модификаторы можно объединять в одну группу: (?i-sm). Такая группа включает режим i и выключает режим s, m. Если использование модификаторов требуется только в пределах группы, то нужный шаблон указывается внутри группы после модификаторов но перед двоеточием. Например, (?-i)(?i:tv)set найдёт TVset, но не TVSET.

Комментарии

Для добавления комментариев в регулярное выражение можно использовать группы-комментарии вида (?#комментарий). Такая группа интерпретатором полностью игнорируется и не проверяется на вхождение в текст. Например, выражение А(?#тут комментарий)Б соответствует строке АБ.

Просмотр вперёд и назад

В большинстве реализаций регулярных выражений есть способ производить поиск фрагмента текста, «просматривая» (но не включая в найденное) окружающий текст, который расположен до или после искомого фрагмента текста. Просмотр с отрицанием используется реже и «следит» за тем, чтобы указанные соответствия, напротив, не встречались до или после искомого текстового фрагмента.

Представление Вид просмотра Пример Соответствие
(?=шаблон) Позитивный просмотр вперёд Людовик(?=XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
(?!шаблон) Негативный просмотр вперёд (с отрицанием) Людовик(?!XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
(?<=шаблон) Позитивный просмотр назад (?<=Сергей )Иванов Сергей Иванов, Игорь Иванов
(?<!шаблон) Негативный просмотр назад (с отрицанием) (?<!Сергей )Иванов Сергей Иванов, Игорь Иванов

Поиск по условию

Во многих реализациях регулярных выражений существует возможность выбирать, по какому пути пойдёт проверка в том или ином месте регулярного выражения на основании уже найденных значений.

Представление Пояснение Пример Соответствие
(?(?=если)то|иначе) Если операция просмотра успешна, то далее выполняется часть то, иначе выполняется часть иначе. В выражении может использоваться любая из четырёх операций просмотра. Следует учитывать, что операция просмотра нулевой ширины, поэтому части то в случае позитивного или иначе в случае негативного просмотра должны включать в себя описание шаблона из операции просмотра. (?(?<=а)м|п) мам,пап
(?(n)то|иначе) Если n-я группа вернула значение, то поиск по условию выполняется по шаблону то, иначе по шаблону иначе. (а)?(?(1)м|п) мам,пап

Флаги

В некоторых языках (например, в JavaScript) реализованы т. н. «флаги», которые расширяют функции регэкспа. Флаги указываются после регулярного выражения (порядок флагов значения не имеет). Типичные флаги:

  • g — глобальный поиск (обрабатываются все совпадения с шаблоном поиска).
  • i — регистр букв не имеет значения;
  • m — многострочный поиск.
  • s — текст трактуется как одна строка, в этом случае метасимволу . (точка) соответствует любой одиночный символ, включая символ новой строки;

Флаг указывается после паттерна, например, вот так: /[0-9]$/m

Разновидности регулярных выражений

Базовые регулярные выражения POSIX

(англ. basic regular expressions (BRE)). Традиционные регулярные выражения UNIX. Синтаксис базовых регулярных выражений на данный момент определён POSIX как устаревший, но он до сих пор широко распространён из соображений обратной совместимости. Многие UNIX-утилиты используют такие регулярные выражения по умолчанию.

В данную версию включены метасимволы:

  • .
  • [ ]
  • [^ ]
  • ^ (действует только в начале выражения)
  • $ (действует только в конце выражения)
  • *
  • \{ \} — первоначальный вариант для { }
  • \( \) — первоначальный вариант для ( )
  • \n, где n — номер от 1 до 9

Особенности:

  • Звёздочка должна следовать после выражения, соответствующего единичному символу. Пример: [xyz]*.
  • Выражение \(блок\)* следует считать неправильным. В некоторых случаях оно соответствует нулю или более повторений строки блок. В других оно соответствует строке блок*.
  • Внутри символьного класса специальные значения символов, в основном, игнорируются. Особые случаи:
    • Чтобы добавить символ ^ в набор, его следует поместить туда не первым.
    • Чтобы добавить символ - в набор, его следует поместить туда первым или последним. Например:
      • шаблон DNS-имени, куда могут входить буквы, цифры, минус и точка-разделитель: [-0-9a-zA-Z.];
      • любой символ, кроме минуса и цифры: [^-0-9].
    • Чтобы добавить символ [ или ] в набор, его следует поместить туда первым. Например:
      • [][ab] соответствует ], [, a или b.

Расширенные регулярные выражения POSIX

(англ. extended regular expressions (ERE)). Синтаксис в основном аналогичен традиционному.

  • Отменено использование обратной косой черты для метасимволов { } и ( ).
  • Обратная косая черта перед метасимволом отменяет его специальное значение (см. Представление специальных символов).
  • Отвергнута теоретически нерегулярная конструкция \n.
  • Добавлены метасимволы +, ?, |.

Регулярные выражения, совместимые с Perl

Perl-совместимые регулярные выражения (англ. Perl-compatible regular expressions (PCRE)) имеют более богатый и в то же время предсказуемыйК:Википедия:Статьи без источников (тип: не указан)[источник не указан 5450 дней] синтаксис, чем даже POSIX ERE. По этой причине очень многие приложения используют именно Perl-совместимый синтаксис регулярных выражений.

Нечёткие регулярные выражения

В некоторых случаях регулярные выражения удобно применить для анализа текстовых фрагментов на естественном языке, то есть написанных людьми, и возможно содержащих опечатки, либо нестандартные варианты употреблений слов. Например, если проводить опрос (допустим, на веб-сайте) «какой станцией метро вы пользуетесь», может оказаться что «Невский проспект» посетители могут указать как:

  • Невский
  • Невск. просп.
  • Нев. проспект
  • наб. Канала Грибоедова («Канал Грибоедова» это название второго выхода ст.м. Невский Проспект)

Здесь обычные регулярные выражения неприменимы, в первую очередь из-за того что входящие в образцы слова могут совпадать не очень точно (нечётко), но тем не менее было бы удобно описывать регулярными выражениями структурные зависимости между элементами образца, например, в нашем случае, указать, что совпадение может быть с образцом «Невский проспект» ИЛИ «Канал Грибоедова», притом «проспект» может быть сокращено до «пр» или отсутствовать, а перед «Канал» может находиться сокращение «наб.»

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

Существует небольшое количество библиотек, реализующих механизм регулярных выражений с возможностью нечёткого сравнения:

  • TRE — бесплатная библиотека на С, использующая синтаксис регулярных выражений, похожий на POSIX (стабильный проект);
  • FREJ — open-source библиотека на Java, использующая Lisp-образный синтаксис и лишённая многих возможностей обычных регулярных выражений, но сосредоточенная на различного рода автоматических заменах фрагментов текста (бета-версия).

Реализации

  • NFA (англ. nondeterministic finite-state automata — недетерминированные конечные автоматы) используют жадный алгоритм отката, проверяя все возможные расширения регулярного выражения в определённом порядке и выбирая первое подходящее значение. NFA может обрабатывать подвыражения и обратные ссылки. Но из-за алгоритма отката традиционный NFA может проверять одно и то же место несколько раз, что отрицательно сказывается на скорости работы. Поскольку традиционный NFA принимает первое найденное соответствие, он может и не найти самое длинное из вхождений (этого требует стандарт POSIX, и существуют модификации NFA выполняющие это требование — GNU sed). Именно такой механизм регулярных выражений используется, например, в Perl, Tcl и .NET.
  • DFA (англ. deterministic finite-state automata — детерминированные конечные автоматы) работают линейно по времени, поскольку не используют откаты и никогда не проверяют какую-либо часть текста дважды. Они могут гарантированно найти самую длинную строку из возможных. DFA содержит только конечное состояние, следовательно, не обрабатывает обратных ссылок, а также не поддерживает конструкций с явным расширением, то есть не способен обработать и подвыражения. DFA используется, например, в lex и egrep.

См. также

Напишите отзыв о статье "Регулярные выражения"

Примечания

  1. [docs.oracle.com/javase/tutorial/essential/regex/ docs.oracle.com]
  2. [msdn.microsoft.com/ru-ru/library/az24scfc(v=VS.100).aspx MSDN]
  3. Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции. Синтаксический анализ. — Мир. — М., 1978. — Т. 2.
  4. Во многих книгах используются символы , + или вместо |.
  5. Для использования последовательностей букв необходимо установить правильную кодовую страницу, в которой эти последовательности будут идти в порядке от и до указанных символов. Для русского языка это Windows-1251, ISO 8859-5 и Юникод, так как в DOS-855, DOS-866 и KOI8-R русские буквы не идут одной целой группой или не упорядочены по алфавиту. Отдельное внимание следует уделять буквам с диакритическими знаками, наподобие русских Ё/ё, которые, как правило, разбросаны вне основных диапазонов символов.

Литература

  • Фридл, Дж. Регулярные выражения. — СПб.: «Питер», 2001. — 352 с. — (Библиотека программиста). — ISBN 5-318-00056-8.
  • Смит, Билл. Методы и алгоритмы вычислений на строках (regexp) = Computing Patterns in Strings. — М.: «Вильямс», 2006. — 496 с. — ISBN 0-201-39839-7.
  • Форта, Бен. Освой самостоятельно регулярные выражения. 10 минут на урок = Sams Teach Yourself Regular Expressions in 10 Minutes. — М.: «Вильямс», 2005. — 184 с. — ISBN 5-8459-0713-6.
  • Ян Гойвертс, Стивен Левитан. Регулярные выражения. Сборник рецептов. — СПб.: «Символ-Плюс», 2010. — 608 с. — ISBN 978-5-93286-181-3.
  • Мельников С. В. Perl для профессиональных программистов. Регулярные выражения. — М.: «Бином», 2007. — 190 с. — (Основы информационных технологий). — ISBN 978-5-94774-797-3.

Ссылки

  • [www.regular-expressions.info/ Справочник и ресурсы по регулярным выражениям]  (англ.) — учебник и детальное описание синтаксиса с примерами, сравнение различных интерпретаторов и прочее
  • [msdn.microsoft.com/ru-ru/library/28hw3sce.aspx MSDN — Знакомство с регулярными выражениями]  (рус.)
  • [rus-linux.net/nlib.php?name=/MyLDP/algol/cpattern/Regular_Expressions_in_C_ru.html Реализация механизма обработки регулярных выражений на языке C++]
  • [lipetsk.lug.ru/projects/re/re-building-howto.html Теория и методика построения регулярных выражений. Проблема самообразования]  (рус.)
  • [regexp-online.com/ Онлайн-генератор регулярных выражений на PHP для новичков]  (рус.)
  • [gskinner.com/RegExr/ Конструктор регулярных выражений с подсветкой синтаксиса]  (англ.)
  • [laurikari.net/tre TRE — Бесплатная и переносимая библиотека для нечёткого сравнения с помощью регулярных выражений]
  • [frej.sf.net FREJ (Fuzzy Regular Expressions for Java)] — Нечёткие регулярные выражения для Java на SourceForge.net

Отрывок, характеризующий Регулярные выражения

– Вчера получил известие о его кончине, – коротко сказал князь Андрей.
Кутузов испуганно открытыми глазами посмотрел на князя Андрея, потом снял фуражку и перекрестился: «Царство ему небесное! Да будет воля божия над всеми нами!Он тяжело, всей грудью вздохнул и помолчал. „Я его любил и уважал и сочувствую тебе всей душой“. Он обнял князя Андрея, прижал его к своей жирной груди и долго не отпускал от себя. Когда он отпустил его, князь Андрей увидал, что расплывшие губы Кутузова дрожали и на глазах были слезы. Он вздохнул и взялся обеими руками за лавку, чтобы встать.
– Пойдем, пойдем ко мне, поговорим, – сказал он; но в это время Денисов, так же мало робевший перед начальством, как и перед неприятелем, несмотря на то, что адъютанты у крыльца сердитым шепотом останавливали его, смело, стуча шпорами по ступенькам, вошел на крыльцо. Кутузов, оставив руки упертыми на лавку, недовольно смотрел на Денисова. Денисов, назвав себя, объявил, что имеет сообщить его светлости дело большой важности для блага отечества. Кутузов усталым взглядом стал смотреть на Денисова и досадливым жестом, приняв руки и сложив их на животе, повторил: «Для блага отечества? Ну что такое? Говори». Денисов покраснел, как девушка (так странно было видеть краску на этом усатом, старом и пьяном лице), и смело начал излагать свой план разрезания операционной линии неприятеля между Смоленском и Вязьмой. Денисов жил в этих краях и знал хорошо местность. План его казался несомненно хорошим, в особенности по той силе убеждения, которая была в его словах. Кутузов смотрел себе на ноги и изредка оглядывался на двор соседней избы, как будто он ждал чего то неприятного оттуда. Из избы, на которую он смотрел, действительно во время речи Денисова показался генерал с портфелем под мышкой.
– Что? – в середине изложения Денисова проговорил Кутузов. – Уже готовы?
– Готов, ваша светлость, – сказал генерал. Кутузов покачал головой, как бы говоря: «Как это все успеть одному человеку», и продолжал слушать Денисова.
– Даю честное благородное слово гусского офицег'а, – говорил Денисов, – что я г'азог'ву сообщения Наполеона.
– Тебе Кирилл Андреевич Денисов, обер интендант, как приходится? – перебил его Кутузов.
– Дядя г'одной, ваша светлость.
– О! приятели были, – весело сказал Кутузов. – Хорошо, хорошо, голубчик, оставайся тут при штабе, завтра поговорим. – Кивнув головой Денисову, он отвернулся и протянул руку к бумагам, которые принес ему Коновницын.
– Не угодно ли вашей светлости пожаловать в комнаты, – недовольным голосом сказал дежурный генерал, – необходимо рассмотреть планы и подписать некоторые бумаги. – Вышедший из двери адъютант доложил, что в квартире все было готово. Но Кутузову, видимо, хотелось войти в комнаты уже свободным. Он поморщился…
– Нет, вели подать, голубчик, сюда столик, я тут посмотрю, – сказал он. – Ты не уходи, – прибавил он, обращаясь к князю Андрею. Князь Андрей остался на крыльце, слушая дежурного генерала.
Во время доклада за входной дверью князь Андрей слышал женское шептанье и хрустение женского шелкового платья. Несколько раз, взглянув по тому направлению, он замечал за дверью, в розовом платье и лиловом шелковом платке на голове, полную, румяную и красивую женщину с блюдом, которая, очевидно, ожидала входа влавввквмандующего. Адъютант Кутузова шепотом объяснил князю Андрею, что это была хозяйка дома, попадья, которая намеревалась подать хлеб соль его светлости. Муж ее встретил светлейшего с крестом в церкви, она дома… «Очень хорошенькая», – прибавил адъютант с улыбкой. Кутузов оглянулся на эти слова. Кутузов слушал доклад дежурного генерала (главным предметом которого была критика позиции при Цареве Займище) так же, как он слушал Денисова, так же, как он слушал семь лет тому назад прения Аустерлицкого военного совета. Он, очевидно, слушал только оттого, что у него были уши, которые, несмотря на то, что в одном из них был морской канат, не могли не слышать; но очевидно было, что ничто из того, что мог сказать ему дежурный генерал, не могло не только удивить или заинтересовать его, но что он знал вперед все, что ему скажут, и слушал все это только потому, что надо прослушать, как надо прослушать поющийся молебен. Все, что говорил Денисов, было дельно и умно. То, что говорил дежурный генерал, было еще дельнее и умнее, но очевидно было, что Кутузов презирал и знание и ум и знал что то другое, что должно было решить дело, – что то другое, независимое от ума и знания. Князь Андрей внимательно следил за выражением лица главнокомандующего, и единственное выражение, которое он мог заметить в нем, было выражение скуки, любопытства к тому, что такое означал женский шепот за дверью, и желание соблюсти приличие. Очевидно было, что Кутузов презирал ум, и знание, и даже патриотическое чувство, которое выказывал Денисов, но презирал не умом, не чувством, не знанием (потому что он и не старался выказывать их), а он презирал их чем то другим. Он презирал их своей старостью, своею опытностью жизни. Одно распоряжение, которое от себя в этот доклад сделал Кутузов, откосилось до мародерства русских войск. Дежурный редерал в конце доклада представил светлейшему к подписи бумагу о взысканий с армейских начальников по прошению помещика за скошенный зеленый овес.
Кутузов зачмокал губами и закачал головой, выслушав это дело.
– В печку… в огонь! И раз навсегда тебе говорю, голубчик, – сказал он, – все эти дела в огонь. Пуская косят хлеба и жгут дрова на здоровье. Я этого не приказываю и не позволяю, но и взыскивать не могу. Без этого нельзя. Дрова рубят – щепки летят. – Он взглянул еще раз на бумагу. – О, аккуратность немецкая! – проговорил он, качая головой.


– Ну, теперь все, – сказал Кутузов, подписывая последнюю бумагу, и, тяжело поднявшись и расправляя складки своей белой пухлой шеи, с повеселевшим лицом направился к двери.
Попадья, с бросившеюся кровью в лицо, схватилась за блюдо, которое, несмотря на то, что она так долго приготовлялась, она все таки не успела подать вовремя. И с низким поклоном она поднесла его Кутузову.
Глаза Кутузова прищурились; он улыбнулся, взял рукой ее за подбородок и сказал:
– И красавица какая! Спасибо, голубушка!
Он достал из кармана шаровар несколько золотых и положил ей на блюдо.
– Ну что, как живешь? – сказал Кутузов, направляясь к отведенной для него комнате. Попадья, улыбаясь ямочками на румяном лице, прошла за ним в горницу. Адъютант вышел к князю Андрею на крыльцо и приглашал его завтракать; через полчаса князя Андрея позвали опять к Кутузову. Кутузов лежал на кресле в том же расстегнутом сюртуке. Он держал в руке французскую книгу и при входе князя Андрея, заложив ее ножом, свернул. Это был «Les chevaliers du Cygne», сочинение madame de Genlis [«Рыцари Лебедя», мадам де Жанлис], как увидал князь Андрей по обертке.
– Ну садись, садись тут, поговорим, – сказал Кутузов. – Грустно, очень грустно. Но помни, дружок, что я тебе отец, другой отец… – Князь Андрей рассказал Кутузову все, что он знал о кончине своего отца, и о том, что он видел в Лысых Горах, проезжая через них.
– До чего… до чего довели! – проговорил вдруг Кутузов взволнованным голосом, очевидно, ясно представив себе, из рассказа князя Андрея, положение, в котором находилась Россия. – Дай срок, дай срок, – прибавил он с злобным выражением лица и, очевидно, не желая продолжать этого волновавшего его разговора, сказал: – Я тебя вызвал, чтоб оставить при себе.
– Благодарю вашу светлость, – отвечал князь Андрей, – но я боюсь, что не гожусь больше для штабов, – сказал он с улыбкой, которую Кутузов заметил. Кутузов вопросительно посмотрел на него. – А главное, – прибавил князь Андрей, – я привык к полку, полюбил офицеров, и люди меня, кажется, полюбили. Мне бы жалко было оставить полк. Ежели я отказываюсь от чести быть при вас, то поверьте…
Умное, доброе и вместе с тем тонко насмешливое выражение светилось на пухлом лице Кутузова. Он перебил Болконского:
– Жалею, ты бы мне нужен был; но ты прав, ты прав. Нам не сюда люди нужны. Советчиков всегда много, а людей нет. Не такие бы полки были, если бы все советчики служили там в полках, как ты. Я тебя с Аустерлица помню… Помню, помню, с знаменем помню, – сказал Кутузов, и радостная краска бросилась в лицо князя Андрея при этом воспоминании. Кутузов притянул его за руку, подставляя ему щеку, и опять князь Андрей на глазах старика увидал слезы. Хотя князь Андрей и знал, что Кутузов был слаб на слезы и что он теперь особенно ласкает его и жалеет вследствие желания выказать сочувствие к его потере, но князю Андрею и радостно и лестно было это воспоминание об Аустерлице.
– Иди с богом своей дорогой. Я знаю, твоя дорога – это дорога чести. – Он помолчал. – Я жалел о тебе в Букареште: мне послать надо было. – И, переменив разговор, Кутузов начал говорить о турецкой войне и заключенном мире. – Да, немало упрекали меня, – сказал Кутузов, – и за войну и за мир… а все пришло вовремя. Tout vient a point a celui qui sait attendre. [Все приходит вовремя для того, кто умеет ждать.] A и там советчиков не меньше было, чем здесь… – продолжал он, возвращаясь к советчикам, которые, видимо, занимали его. – Ох, советчики, советчики! – сказал он. Если бы всех слушать, мы бы там, в Турции, и мира не заключили, да и войны бы не кончили. Всё поскорее, а скорое на долгое выходит. Если бы Каменский не умер, он бы пропал. Он с тридцатью тысячами штурмовал крепости. Взять крепость не трудно, трудно кампанию выиграть. А для этого не нужно штурмовать и атаковать, а нужно терпение и время. Каменский на Рущук солдат послал, а я их одних (терпение и время) посылал и взял больше крепостей, чем Каменский, и лошадиное мясо турок есть заставил. – Он покачал головой. – И французы тоже будут! Верь моему слову, – воодушевляясь, проговорил Кутузов, ударяя себя в грудь, – будут у меня лошадиное мясо есть! – И опять глаза его залоснились слезами.
– Однако до лжно же будет принять сражение? – сказал князь Андрей.
– До лжно будет, если все этого захотят, нечего делать… А ведь, голубчик: нет сильнее тех двух воинов, терпение и время; те всё сделают, да советчики n'entendent pas de cette oreille, voila le mal. [этим ухом не слышат, – вот что плохо.] Одни хотят, другие не хотят. Что ж делать? – спросил он, видимо, ожидая ответа. – Да, что ты велишь делать? – повторил он, и глаза его блестели глубоким, умным выражением. – Я тебе скажу, что делать, – проговорил он, так как князь Андрей все таки не отвечал. – Я тебе скажу, что делать и что я делаю. Dans le doute, mon cher, – он помолчал, – abstiens toi, [В сомнении, мой милый, воздерживайся.] – выговорил он с расстановкой.
– Ну, прощай, дружок; помни, что я всей душой несу с тобой твою потерю и что я тебе не светлейший, не князь и не главнокомандующий, а я тебе отец. Ежели что нужно, прямо ко мне. Прощай, голубчик. – Он опять обнял и поцеловал его. И еще князь Андрей не успел выйти в дверь, как Кутузов успокоительно вздохнул и взялся опять за неконченный роман мадам Жанлис «Les chevaliers du Cygne».
Как и отчего это случилось, князь Андрей не мог бы никак объяснить; но после этого свидания с Кутузовым он вернулся к своему полку успокоенный насчет общего хода дела и насчет того, кому оно вверено было. Чем больше он видел отсутствие всего личного в этом старике, в котором оставались как будто одни привычки страстей и вместо ума (группирующего события и делающего выводы) одна способность спокойного созерцания хода событий, тем более он был спокоен за то, что все будет так, как должно быть. «У него не будет ничего своего. Он ничего не придумает, ничего не предпримет, – думал князь Андрей, – но он все выслушает, все запомнит, все поставит на свое место, ничему полезному не помешает и ничего вредного не позволит. Он понимает, что есть что то сильнее и значительнее его воли, – это неизбежный ход событий, и он умеет видеть их, умеет понимать их значение и, ввиду этого значения, умеет отрекаться от участия в этих событиях, от своей личной волн, направленной на другое. А главное, – думал князь Андрей, – почему веришь ему, – это то, что он русский, несмотря на роман Жанлис и французские поговорки; это то, что голос его задрожал, когда он сказал: „До чего довели!“, и что он захлипал, говоря о том, что он „заставит их есть лошадиное мясо“. На этом же чувстве, которое более или менее смутно испытывали все, и основано было то единомыслие и общее одобрение, которое сопутствовало народному, противному придворным соображениям, избранию Кутузова в главнокомандующие.


После отъезда государя из Москвы московская жизнь потекла прежним, обычным порядком, и течение этой жизни было так обычно, что трудно было вспомнить о бывших днях патриотического восторга и увлечения, и трудно было верить, что действительно Россия в опасности и что члены Английского клуба суть вместе с тем и сыны отечества, готовые для него на всякую жертву. Одно, что напоминало о бывшем во время пребывания государя в Москве общем восторженно патриотическом настроении, было требование пожертвований людьми и деньгами, которые, как скоро они были сделаны, облеклись в законную, официальную форму и казались неизбежны.
С приближением неприятеля к Москве взгляд москвичей на свое положение не только не делался серьезнее, но, напротив, еще легкомысленнее, как это всегда бывает с людьми, которые видят приближающуюся большую опасность. При приближении опасности всегда два голоса одинаково сильно говорят в душе человека: один весьма разумно говорит о том, чтобы человек обдумал самое свойство опасности и средства для избавления от нее; другой еще разумнее говорит, что слишком тяжело и мучительно думать об опасности, тогда как предвидеть все и спастись от общего хода дела не во власти человека, и потому лучше отвернуться от тяжелого, до тех пор пока оно не наступило, и думать о приятном. В одиночестве человек большею частью отдается первому голосу, в обществе, напротив, – второму. Так было и теперь с жителями Москвы. Давно так не веселились в Москве, как этот год.
Растопчинские афишки с изображением вверху питейного дома, целовальника и московского мещанина Карпушки Чигирина, который, быв в ратниках и выпив лишний крючок на тычке, услыхал, будто Бонапарт хочет идти на Москву, рассердился, разругал скверными словами всех французов, вышел из питейного дома и заговорил под орлом собравшемуся народу, читались и обсуживались наравне с последним буриме Василия Львовича Пушкина.
В клубе, в угловой комнате, собирались читать эти афиши, и некоторым нравилось, как Карпушка подтрунивал над французами, говоря, что они от капусты раздуются, от каши перелопаются, от щей задохнутся, что они все карлики и что их троих одна баба вилами закинет. Некоторые не одобряли этого тона и говорила, что это пошло и глупо. Рассказывали о том, что французов и даже всех иностранцев Растопчин выслал из Москвы, что между ними шпионы и агенты Наполеона; но рассказывали это преимущественно для того, чтобы при этом случае передать остроумные слова, сказанные Растопчиным при их отправлении. Иностранцев отправляли на барке в Нижний, и Растопчин сказал им: «Rentrez en vous meme, entrez dans la barque et n'en faites pas une barque ne Charon». [войдите сами в себя и в эту лодку и постарайтесь, чтобы эта лодка не сделалась для вас лодкой Харона.] Рассказывали, что уже выслали из Москвы все присутственные места, и тут же прибавляли шутку Шиншина, что за это одно Москва должна быть благодарна Наполеону. Рассказывали, что Мамонову его полк будет стоить восемьсот тысяч, что Безухов еще больше затратил на своих ратников, но что лучше всего в поступке Безухова то, что он сам оденется в мундир и поедет верхом перед полком и ничего не будет брать за места с тех, которые будут смотреть на него.
– Вы никому не делаете милости, – сказала Жюли Друбецкая, собирая и прижимая кучку нащипанной корпии тонкими пальцами, покрытыми кольцами.
Жюли собиралась на другой день уезжать из Москвы и делала прощальный вечер.
– Безухов est ridicule [смешон], но он так добр, так мил. Что за удовольствие быть так caustique [злоязычным]?
– Штраф! – сказал молодой человек в ополченском мундире, которого Жюли называла «mon chevalier» [мой рыцарь] и который с нею вместе ехал в Нижний.
В обществе Жюли, как и во многих обществах Москвы, было положено говорить только по русски, и те, которые ошибались, говоря французские слова, платили штраф в пользу комитета пожертвований.
– Другой штраф за галлицизм, – сказал русский писатель, бывший в гостиной. – «Удовольствие быть не по русски.
– Вы никому не делаете милости, – продолжала Жюли к ополченцу, не обращая внимания на замечание сочинителя. – За caustique виновата, – сказала она, – и плачу, но за удовольствие сказать вам правду я готова еще заплатить; за галлицизмы не отвечаю, – обратилась она к сочинителю: – у меня нет ни денег, ни времени, как у князя Голицына, взять учителя и учиться по русски. А вот и он, – сказала Жюли. – Quand on… [Когда.] Нет, нет, – обратилась она к ополченцу, – не поймаете. Когда говорят про солнце – видят его лучи, – сказала хозяйка, любезно улыбаясь Пьеру. – Мы только говорили о вас, – с свойственной светским женщинам свободой лжи сказала Жюли. – Мы говорили, что ваш полк, верно, будет лучше мамоновского.
– Ах, не говорите мне про мой полк, – отвечал Пьер, целуя руку хозяйке и садясь подле нее. – Он мне так надоел!
– Вы ведь, верно, сами будете командовать им? – сказала Жюли, хитро и насмешливо переглянувшись с ополченцем.
Ополченец в присутствии Пьера был уже не так caustique, и в лице его выразилось недоуменье к тому, что означала улыбка Жюли. Несмотря на свою рассеянность и добродушие, личность Пьера прекращала тотчас же всякие попытки на насмешку в его присутствии.
– Нет, – смеясь, отвечал Пьер, оглядывая свое большое, толстое тело. – В меня слишком легко попасть французам, да и я боюсь, что не влезу на лошадь…
В числе перебираемых лиц для предмета разговора общество Жюли попало на Ростовых.
– Очень, говорят, плохи дела их, – сказала Жюли. – И он так бестолков – сам граф. Разумовские хотели купить его дом и подмосковную, и все это тянется. Он дорожится.
– Нет, кажется, на днях состоится продажа, – сказал кто то. – Хотя теперь и безумно покупать что нибудь в Москве.
– Отчего? – сказала Жюли. – Неужели вы думаете, что есть опасность для Москвы?
– Отчего же вы едете?
– Я? Вот странно. Я еду, потому… ну потому, что все едут, и потом я не Иоанна д'Арк и не амазонка.
– Ну, да, да, дайте мне еще тряпочек.
– Ежели он сумеет повести дела, он может заплатить все долги, – продолжал ополченец про Ростова.
– Добрый старик, но очень pauvre sire [плох]. И зачем они живут тут так долго? Они давно хотели ехать в деревню. Натали, кажется, здорова теперь? – хитро улыбаясь, спросила Жюли у Пьера.
– Они ждут меньшого сына, – сказал Пьер. – Он поступил в казаки Оболенского и поехал в Белую Церковь. Там формируется полк. А теперь они перевели его в мой полк и ждут каждый день. Граф давно хотел ехать, но графиня ни за что не согласна выехать из Москвы, пока не приедет сын.
– Я их третьего дня видела у Архаровых. Натали опять похорошела и повеселела. Она пела один романс. Как все легко проходит у некоторых людей!
– Что проходит? – недовольно спросил Пьер. Жюли улыбнулась.
– Вы знаете, граф, что такие рыцари, как вы, бывают только в романах madame Suza.
– Какой рыцарь? Отчего? – краснея, спросил Пьер.
– Ну, полноте, милый граф, c'est la fable de tout Moscou. Je vous admire, ma parole d'honneur. [это вся Москва знает. Право, я вам удивляюсь.]
– Штраф! Штраф! – сказал ополченец.
– Ну, хорошо. Нельзя говорить, как скучно!
– Qu'est ce qui est la fable de tout Moscou? [Что знает вся Москва?] – вставая, сказал сердито Пьер.
– Полноте, граф. Вы знаете!
– Ничего не знаю, – сказал Пьер.
– Я знаю, что вы дружны были с Натали, и потому… Нет, я всегда дружнее с Верой. Cette chere Vera! [Эта милая Вера!]
– Non, madame, [Нет, сударыня.] – продолжал Пьер недовольным тоном. – Я вовсе не взял на себя роль рыцаря Ростовой, и я уже почти месяц не был у них. Но я не понимаю жестокость…
– Qui s'excuse – s'accuse, [Кто извиняется, тот обвиняет себя.] – улыбаясь и махая корпией, говорила Жюли и, чтобы за ней осталось последнее слово, сейчас же переменила разговор. – Каково, я нынче узнала: бедная Мари Волконская приехала вчера в Москву. Вы слышали, она потеряла отца?
– Неужели! Где она? Я бы очень желал увидать ее, – сказал Пьер.
– Я вчера провела с ней вечер. Она нынче или завтра утром едет в подмосковную с племянником.
– Ну что она, как? – сказал Пьер.
– Ничего, грустна. Но знаете, кто ее спас? Это целый роман. Nicolas Ростов. Ее окружили, хотели убить, ранили ее людей. Он бросился и спас ее…
– Еще роман, – сказал ополченец. – Решительно это общее бегство сделано, чтобы все старые невесты шли замуж. Catiche – одна, княжна Болконская – другая.
– Вы знаете, что я в самом деле думаю, что она un petit peu amoureuse du jeune homme. [немножечко влюблена в молодого человека.]
– Штраф! Штраф! Штраф!
– Но как же это по русски сказать?..


Когда Пьер вернулся домой, ему подали две принесенные в этот день афиши Растопчина.
В первой говорилось о том, что слух, будто графом Растопчиным запрещен выезд из Москвы, – несправедлив и что, напротив, граф Растопчин рад, что из Москвы уезжают барыни и купеческие жены. «Меньше страху, меньше новостей, – говорилось в афише, – но я жизнью отвечаю, что злодей в Москве не будет». Эти слова в первый раз ясно ыоказали Пьеру, что французы будут в Москве. Во второй афише говорилось, что главная квартира наша в Вязьме, что граф Витгснштейн победил французов, но что так как многие жители желают вооружиться, то для них есть приготовленное в арсенале оружие: сабли, пистолеты, ружья, которые жители могут получать по дешевой цене. Тон афиш был уже не такой шутливый, как в прежних чигиринских разговорах. Пьер задумался над этими афишами. Очевидно, та страшная грозовая туча, которую он призывал всеми силами своей души и которая вместе с тем возбуждала в нем невольный ужас, – очевидно, туча эта приближалась.
«Поступить в военную службу и ехать в армию или дожидаться? – в сотый раз задавал себе Пьер этот вопрос. Он взял колоду карт, лежавших у него на столе, и стал делать пасьянс.
– Ежели выйдет этот пасьянс, – говорил он сам себе, смешав колоду, держа ее в руке и глядя вверх, – ежели выйдет, то значит… что значит?.. – Он не успел решить, что значит, как за дверью кабинета послышался голос старшей княжны, спрашивающей, можно ли войти.
– Тогда будет значить, что я должен ехать в армию, – договорил себе Пьер. – Войдите, войдите, – прибавил он, обращаясь к княжие.
(Одна старшая княжна, с длинной талией и окаменелым лидом, продолжала жить в доме Пьера; две меньшие вышли замуж.)
– Простите, mon cousin, что я пришла к вам, – сказала она укоризненно взволнованным голосом. – Ведь надо наконец на что нибудь решиться! Что ж это будет такое? Все выехали из Москвы, и народ бунтует. Что ж мы остаемся?
– Напротив, все, кажется, благополучно, ma cousine, – сказал Пьер с тою привычкой шутливости, которую Пьер, всегда конфузно переносивший свою роль благодетеля перед княжною, усвоил себе в отношении к ней.
– Да, это благополучно… хорошо благополучие! Мне нынче Варвара Ивановна порассказала, как войска наши отличаются. Уж точно можно чести приписать. Да и народ совсем взбунтовался, слушать перестают; девка моя и та грубить стала. Этак скоро и нас бить станут. По улицам ходить нельзя. А главное, нынче завтра французы будут, что ж нам ждать! Я об одном прошу, mon cousin, – сказала княжна, – прикажите свезти меня в Петербург: какая я ни есть, а я под бонапартовской властью жить не могу.
– Да полноте, ma cousine, откуда вы почерпаете ваши сведения? Напротив…
– Я вашему Наполеону не покорюсь. Другие как хотят… Ежели вы не хотите этого сделать…
– Да я сделаю, я сейчас прикажу.
Княжне, видимо, досадно было, что не на кого было сердиться. Она, что то шепча, присела на стул.
– Но вам это неправильно доносят, – сказал Пьер. – В городе все тихо, и опасности никакой нет. Вот я сейчас читал… – Пьер показал княжне афишки. – Граф пишет, что он жизнью отвечает, что неприятель не будет в Москве.
– Ах, этот ваш граф, – с злобой заговорила княжна, – это лицемер, злодей, который сам настроил народ бунтовать. Разве не он писал в этих дурацких афишах, что какой бы там ни был, тащи его за хохол на съезжую (и как глупо)! Кто возьмет, говорит, тому и честь и слава. Вот и долюбезничался. Варвара Ивановна говорила, что чуть не убил народ ее за то, что она по французски заговорила…
– Да ведь это так… Вы всё к сердцу очень принимаете, – сказал Пьер и стал раскладывать пасьянс.
Несмотря на то, что пасьянс сошелся, Пьер не поехал в армию, а остался в опустевшей Москве, все в той же тревоге, нерешимости, в страхе и вместе в радости ожидая чего то ужасного.
На другой день княжна к вечеру уехала, и к Пьеру приехал его главноуправляющий с известием, что требуемых им денег для обмундирования полка нельзя достать, ежели не продать одно имение. Главноуправляющий вообще представлял Пьеру, что все эти затеи полка должны были разорить его. Пьер с трудом скрывал улыбку, слушая слова управляющего.
– Ну, продайте, – говорил он. – Что ж делать, я не могу отказаться теперь!
Чем хуже было положение всяких дел, и в особенности его дел, тем Пьеру было приятнее, тем очевиднее было, что катастрофа, которой он ждал, приближается. Уже никого почти из знакомых Пьера не было в городе. Жюли уехала, княжна Марья уехала. Из близких знакомых одни Ростовы оставались; но к ним Пьер не ездил.
В этот день Пьер, для того чтобы развлечься, поехал в село Воронцово смотреть большой воздушный шар, который строился Леппихом для погибели врага, и пробный шар, который должен был быть пущен завтра. Шар этот был еще не готов; но, как узнал Пьер, он строился по желанию государя. Государь писал графу Растопчину об этом шаре следующее:
«Aussitot que Leppich sera pret, composez lui un equipage pour sa nacelle d'hommes surs et intelligents et depechez un courrier au general Koutousoff pour l'en prevenir. Je l'ai instruit de la chose.
Recommandez, je vous prie, a Leppich d'etre bien attentif sur l'endroit ou il descendra la premiere fois, pour ne pas se tromper et ne pas tomber dans les mains de l'ennemi. Il est indispensable qu'il combine ses mouvements avec le general en chef».
[Только что Леппих будет готов, составьте экипаж для его лодки из верных и умных людей и пошлите курьера к генералу Кутузову, чтобы предупредить его.
Я сообщил ему об этом. Внушите, пожалуйста, Леппиху, чтобы он обратил хорошенько внимание на то место, где он спустится в первый раз, чтобы не ошибиться и не попасть в руки врага. Необходимо, чтоб он соображал свои движения с движениями главнокомандующего.]
Возвращаясь домой из Воронцова и проезжая по Болотной площади, Пьер увидал толпу у Лобного места, остановился и слез с дрожек. Это была экзекуция французского повара, обвиненного в шпионстве. Экзекуция только что кончилась, и палач отвязывал от кобылы жалостно стонавшего толстого человека с рыжими бакенбардами, в синих чулках и зеленом камзоле. Другой преступник, худенький и бледный, стоял тут же. Оба, судя по лицам, были французы. С испуганно болезненным видом, подобным тому, который имел худой француз, Пьер протолкался сквозь толпу.
– Что это? Кто? За что? – спрашивал он. Но вниманье толпы – чиновников, мещан, купцов, мужиков, женщин в салопах и шубках – так было жадно сосредоточено на то, что происходило на Лобном месте, что никто не отвечал ему. Толстый человек поднялся, нахмурившись, пожал плечами и, очевидно, желая выразить твердость, стал, не глядя вокруг себя, надевать камзол; но вдруг губы его задрожали, и он заплакал, сам сердясь на себя, как плачут взрослые сангвинические люди. Толпа громко заговорила, как показалось Пьеру, – для того, чтобы заглушить в самой себе чувство жалости.
– Повар чей то княжеский…
– Что, мусью, видно, русский соус кисел французу пришелся… оскомину набил, – сказал сморщенный приказный, стоявший подле Пьера, в то время как француз заплакал. Приказный оглянулся вокруг себя, видимо, ожидая оценки своей шутки. Некоторые засмеялись, некоторые испуганно продолжали смотреть на палача, который раздевал другого.
Пьер засопел носом, сморщился и, быстро повернувшись, пошел назад к дрожкам, не переставая что то бормотать про себя в то время, как он шел и садился. В продолжение дороги он несколько раз вздрагивал и вскрикивал так громко, что кучер спрашивал его:
– Что прикажете?
– Куда ж ты едешь? – крикнул Пьер на кучера, выезжавшего на Лубянку.
– К главнокомандующему приказали, – отвечал кучер.
– Дурак! скотина! – закричал Пьер, что редко с ним случалось, ругая своего кучера. – Домой я велел; и скорее ступай, болван. Еще нынче надо выехать, – про себя проговорил Пьер.
Пьер при виде наказанного француза и толпы, окружавшей Лобное место, так окончательно решил, что не может долее оставаться в Москве и едет нынче же в армию, что ему казалось, что он или сказал об этом кучеру, или что кучер сам должен был знать это.
Приехав домой, Пьер отдал приказание своему все знающему, все умеющему, известному всей Москве кучеру Евстафьевичу о том, что он в ночь едет в Можайск к войску и чтобы туда были высланы его верховые лошади. Все это не могло быть сделано в тот же день, и потому, по представлению Евстафьевича, Пьер должен был отложить свой отъезд до другого дня, с тем чтобы дать время подставам выехать на дорогу.
24 го числа прояснело после дурной погоды, и в этот день после обеда Пьер выехал из Москвы. Ночью, переменя лошадей в Перхушкове, Пьер узнал, что в этот вечер было большое сражение. Рассказывали, что здесь, в Перхушкове, земля дрожала от выстрелов. На вопросы Пьера о том, кто победил, никто не мог дать ему ответа. (Это было сражение 24 го числа при Шевардине.) На рассвете Пьер подъезжал к Можайску.
Все дома Можайска были заняты постоем войск, и на постоялом дворе, на котором Пьера встретили его берейтор и кучер, в горницах не было места: все было полно офицерами.