Русская Википедия:Регулярные выражения

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Диалог «Поиск и замена» из LibreOffice
Диалог «Поиск и замена» из LibreOffice с включенными регулярными выражениями

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

Возможности

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

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

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

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

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

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

Набор утилит (включая редактор sed и фильтр grep), поставляемых в дистрибутивах UNIX, одним из первых способствовал популяризации регулярных выражений для обработки текстов. Многие современные языки программирования имеют встроенную поддержку регулярных выражений. Среди них 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 (Шаблон:Lang-en — Perl-совместимые регулярные выражения), которая используется во многих современных инструментах, таких как PHP и ApacheШаблон:Нет АИ.

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

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

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

Регулярные выражения, входящие в современные языки программирования (в частности, PCRE), имеют больше возможностей, чем то, что называется регулярными выражениями в теории формальных языков; в частности, в них есть нумерованные обратные ссылкиШаблон:Переход. Это позволяет им разбирать строки, описываемые не только регулярными грамматиками, но и более сложными, в частности, контекстно-свободными грамматиками[5][6].

Синтаксис

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

Шаблон:Main

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

Большинство символов в регулярном выражении представляет само себя за исключением специальных символов Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc (в разных типах регулярных выражений этот набор различается, см. Разновидности регулярных выражений), которые могут быть экранированы символом Шаблон:Nobrc (обратная косая черта) для представления самих себя в качестве символов текста. Можно экранировать целую последовательность символов, заключив её между Шаблон:Nobrc и Шаблон:Nobrc.

Пример Соответствие
Шаблон:Nobrc Шаблон:Nobrc или Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc

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

Любой символ

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

Вместо символа Шаблон:Nobrc можно использовать Шаблон:Nobrc (все пробельные и непробельные символы, включая символ новой строки).

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

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

Если требуется указать символы, которые не входят в указанный набор, то используют символ Шаблон:Nobrc внутри квадратных скобок, например Шаблон:Nobrc означает любой символ, кроме цифр.

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

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

Символ Возможный эквивалент[9] Соответствие
Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc

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

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

Представление Позиция Пример Соответствие
Шаблон:Nobrc Начало текста (или строки при модификаторе ?m) Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Конец текста (или строки при модификаторе ?m) Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Граница слова Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Не граница слова Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Предыдущий успешный поиск Шаблон:Nobrc Шаблон:Nobrc (поиск остановился на 4-й позиции — там, где не нашлось Шаблон:Nobrc)

Специальные символы

\n — перевод строки

\r — возврат каретки

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

Круглые скобки используются для определения области действия и приоритета операций. Шаблон внутри группы обрабатывается как единое целое и может быть квантифицирован. Например, выражение Шаблон:Nobrc найдёт последовательность вида Шаблон:Nobrc.

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

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

Если требуется указать перечень вариантов внутри более сложного регулярного выражения, то его нужно заключить в группу. Например, Шаблон:Nobrc или Шаблон:Nobrc описывают строку Шаблон:Nobrc или Шаблон:Nobrc. В случае с односимвольными альтернативами предпочтителен вариант Шаблон:Nobrc, так как сравнение с символьным классом выполняется проще, чем обработка группы с проверкой на все её возможные модификаторы и генерацией обратной связи.

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

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

Представление Число повторений Эквивалент Пример Соответствие
Шаблон:Nobrc Ноль или одно Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc, Шаблон:Nobrc
Шаблон:Nobrc Ноль или более Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc, Шаблон:Nobrc, Шаблон:Nobrc и т. д.
Шаблон:Nobrc Одно или более Шаблон:Nobrc Шаблон:Nobrc Шаблон:Nobrc, Шаблон:Nobrc и т. д. (но не Шаблон:Nobrc)
Представление Число повторений Пример Соответствие
Шаблон:Nobrc Ровно n раз Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc От m до n включительно Шаблон:Nobrc Шаблон:Nobrc, Шаблон:Nobrc, Шаблон:Nobrc
Шаблон:Nobrc Не менее m Шаблон:Nobrc Шаблон:Nobrc, Шаблон:Nobrc, Шаблон:Nobrc и т. д.
Шаблон:Nobrc Не более n Шаблон:Nobrc Шаблон:Nobrc, Шаблон:Nobrc, Шаблон:Nobrc, Шаблон:Nobrc

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

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

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

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

Шаблон:Врезка

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

Шаблон:Inverse

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

  1. Учитывать символы, не соответствующие желаемому образцу (Шаблон:Nobrc для вышеописанного случая).
  2. Определить квантификатор как нежадный (ленивый, Шаблон:Lang-en) — большинство реализаций позволяют это сделать, добавив после него знак вопроса.

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

Жадный Ленивый
Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc

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

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

Шаблон:Врезка

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

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

Жадный Ревнивый
Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Шаблон:Nobrc
Пример Соответствие
Шаблон:Nobrc Шаблон:Nobrc; но не Шаблон:Nobrc, так как буква Шаблон:Nobrc уже занята

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

Группировка

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

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

Например, регулярное выражение Шаблон:Nobrc найдёт строку Шаблон:Nobrc или Шаблон:Nobrc, но пропустит строку Шаблон:Nobrc.

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

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

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

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

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

Пример Соответствие Создаваемые группы
Шаблон:Nobrc Шаблон:Nobrc

Шаблон:Nobrc

Шаблон:Nobrc

Шаблон:Nobrc

Шаблон:Nobrc Шаблон:Nobrc, Шаблон:Nobrc нет
Шаблон:Nobrc Шаблон:Nobrc

но не Шаблон:Nobrc: вариант Шаблон:Nobrc найден, остальные проигнорированы

нет
Шаблон:Nobrc не найдётся Шаблон:Nobrc: все Шаблон:Nobrc заняты, и нет возврата внутрь группы

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

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

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

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

Синтаксис Описание
Шаблон:Nobrc Включает нечувствительность выражения к регистру символов (Шаблон:Lang-en)
Шаблон:Nobrc Выключает
Шаблон:Nobrc Включает режим соответствия точки символам переноса строки и возврата каретки
Шаблон:Nobrc Выключает
Шаблон:Nobrc Символы Шаблон:Nobrc и Шаблон:Nobrc вызывают соответствие только после и до символов новой строки
Шаблон:Nobrc с началом и концом текста
Шаблон:Nobrc Включает режим без учёта пробелов между частями регулярного выражения и позволяет использовать Шаблон:Nobrc для комментариев
Шаблон:Nobrc Выключает

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

Комментарии

Для добавления комментариев в регулярное выражение можно использовать группы-комментарии вида Шаблон:Nobrc. Такая группа интерпретатором полностью игнорируется и не проверяется на вхождение в текст. Например, выражение Шаблон:Nobrc соответствует строке Шаблон:Nobrc.

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

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

Представление Вид просмотра Пример Соответствие
Шаблон:Nobrc Позитивный просмотр вперёд Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Негативный просмотр вперёд (с отрицанием) Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Позитивный просмотр назад Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Негативный просмотр назад (с отрицанием) Шаблон:Nobrc Шаблон:Nobrc

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

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

Представление Пояснение Пример Соответствие
Шаблон:Nobrc Если операция просмотра успешна, то далее выполняется часть Шаблон:Nobrc, иначе выполняется часть Шаблон:Nobrc. В выражении может использоваться любая из четырёх операций просмотра. Следует учитывать, что операция просмотра нулевой ширины, поэтому части Шаблон:Nobrc в случае позитивного или Шаблон:Nobrc в случае негативного просмотра должны включать в себя описание шаблона из операции просмотра. Шаблон:Nobrc Шаблон:Nobrc
Шаблон:Nobrc Если n-я группа вернула значение, то поиск по условию выполняется по шаблону Шаблон:Nobrc, иначе по шаблону Шаблон:Nobrc. Шаблон:Nobrc Шаблон:Nobrc

Флаги

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

  • g — глобальный поиск (обрабатываются все совпадения с шаблоном поиска);
  • i — регистр букв не имеет значения;
  • m — многострочный поиск;
  • s — текст трактуется как одна строка, в этом случае метасимволу . (точка) соответствует любой одиночный символ, включая символ новой строки;
  • u — unicode-трактовка. Выражение может содержать специальные паттерны, характерные для юникода, например, /\p{Lu}/ — заглавные буквы.

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

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

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

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

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

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

  • Звёздочка должна следовать после выражения, соответствующего единичному символу. Пример: Шаблон:Nobrc.
  • Выражение Шаблон:Nobrc следует считать неправильным. В некоторых случаях оно соответствует нулю или более повторений строки Шаблон:Nobrc. В других оно соответствует строке Шаблон:Nobrc.
  • Внутри символьного класса специальные значения символов, в основном, игнорируются. Особые случаи:

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

(Шаблон:Lang-en (ERE)). Синтаксис в основном аналогичен традиционному.

Шаблон:Также

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

Шаблон:Main Perl-совместимые регулярные выражения (Шаблон:Lang-en (PCRE)) имеют более богатый синтаксис, чем даже POSIX ERE. По этой причине очень многие приложения используют именно Perl-совместимый синтаксис регулярных выражений.

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

Шаблон:Mainref Unicode — это набор символов, целью которого является определение всех символов и символов со всех человеческих языков, живых и мёртвых. Регулярные выражения, рассчитанные на множество языков, таким образом не привязываются к конкретным наборам символов, а описывают их согласно принятым правилам. Так, например, выражение для нахождения заглавных букв в любом алфавите будет выглядеть так: /\p{Lu}/.

Некоторые выражения regexp — unicode:
представление функциональность
возможная краткая форма возможная полная форма
Буквы
\p{L} \p{Letter} любые буквы любого языка
\p{Ll} \p{Lowercase_Letter} буквы нижнего регистра (строчные) из тех, что имеют прописной вариант написания
\p{Lu} \p{Uppercase_Letter} буквы верхнего регистра (прописные) для тех, что имеют строчный вариант написания
\p{Lt} \p{Titlecase_Letter} прописная буква, которая появляется с начала слова из строчных букв
\p{L&} \p{Cased_Letter} буква, которая имеет как прописной, так и строчный варианты написания
\p{Lm} \p{Modifier_Letter} специальные символы, которые используются как буквы
\p{Lo} \p{Other_Letter} символ или идеограмма, которая не имеет прописных и строчных вариантов написания
Специальные символы
\p{M} \p{Mark} символы, вставленные для комбинирования с другими символами (например акценты, умляуты, оборачивающие скобки)
\p{Mn} \p{Non_Spacing_Mark} символ, вставленный для комбинирования с другими символами, не занимая дополнительной ширины
\p{Mc} \p{Spacing_Combining_Mark} символы, вставленные для комбинирования с другими символами, занимая дополнительную ширину (как во многих восточных языках)
\p{Me} \p{Enclosing_Mark} символы, которые оборачивают символ. Например круг, квадрат и т.п
Пробелы и разделители
\p{Z} \p{Separator} любые виды пробелов или невидимых разделителей
\p{Zs} \p{Space_Separator} пробельные символы, которые невидимы, но имеют ширину
\p{Zl} \p{Line_Separator} символ разделения в виде линии U+2028
\p{Zp} \p{Paragraph_Separator} знак параграфа U+2029
Математические символы
\p{S} \p{Symbol} математические символы, символы валюты, символы псевдографики (рамки) и т. п.
\p{Sm} \p{Math_Symbol} любые математические символы
\p{Sc} \p{Currency_Symbol} любые символы валют
\p{Sk} \p{Modifier_Symbol} комбинированный символ (пометка) как комбинация самого символа и символа отметки
\p{So} \p{Other_Symbol} различные символы, не математические, не символы валют или их комбинации
Цифровые символы
\p{N} \p{Number} любые виды цифровых символов в любых языках
\p{Nd} \p{Decimal_Digit_Number} цифры от нуля до девятки в любых языках
\p{Nl} \p{Letter_Number} число, которое может выглядеть как буквы, например как римские числа
\p{No} \p{Other_Number} число, представленное как верхний или нижний индекс, или число, которое не состоит из цифр (исключая числа из идеографических письменностей)
Знаки пунктуации
\p{P} \p{Punctuation} любой вид пунктуационных знаков
\p{Pd} \p{Dash_Punctuation} любой вид дефисов или тире
\p{Ps} \p{Open_Punctuation} любой вид открывающих скобок
\p{Pe} \p{Close_Punctuation} любой вид закрывающих скобок
\p{Pi} \p{Initial_Punctuation} любой вид открывающих кавычек
\p{Pf} \p{Final_Punctuation} любой вид закрывающих кавычек
\p{Pc} \p{Connector_Punctuation} пунктуационные символы, такие как знаки подчёркивания или соединения слов
\p{Po} \p{Other_Punctuation} любые виды пунктуационных символов, что не являются точками, скобками, кавычками или соединителями
Управляющие символы
\p{C} \p{Other} невидимые управляющие символы и неиспользуемые позиции
\p{Cc} \p{Control} ASCII или Latin-1 управляющие символы: 0x00-0x1F и 0x7F-0x9F
\p{Cf} \p{Format} невидимые индикаторы форматирования
\p{Co} \p{Private_Use} любые позиции, зарезервированные для личного использования
\p{Cs} \p{Surrogate} половина суррогатных пар в кодировке UTF-16
\p{Cn} \p{Unassigned} любые позиции, у которых не назначены символы

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

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

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

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

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

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

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

Реализации

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

См. также

Примечания

Шаблон:Примечания

Литература

Ссылки

Шаблон:Формальные языки

  1. Шаблон:Cite web
  2. Шаблон:Cite web
  3. Шаблон:Книга
  4. Во многих книгах используются символы ∪, + или ∨ вместо |.
  5. Шаблон:Cite web Перевод: Истинное могущество регулярных выражений Шаблон:Wayback.
  6. Шаблон:Публикация
  7. Для использования последовательностей букв необходимо установить правильную кодовую страницу, в которой эти последовательности будут идти в порядке от и до указанных символов. Для русского языка это Windows-1251, ISO 8859-5 и Юникод, так как в DOS-855, DOS-866 и KOI8-R русские буквы не идут одной целой группой или не упорядочены по алфавиту. Отдельное внимание следует уделять буквам с диакритическими знаками, наподобие русских Ё/ё, которые, как правило, разбросаны вне основных диапазонов символов.
  8. Шаблон:Cite web
  9. Варьируется в зависимости от реализации механизма регулярных выражений