Интернет магазин китайских планшетных компьютеров



Компьютеры - Регулярные выражения - Синтаксис

22 января 2011


Оглавление:
1. Регулярные выражения
2. История
3. В теории формальных языков
4. Синтаксис
5. Разновидности регулярных выражений
6. Нечёткие регулярные выражения
7. Реализации



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

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

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

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

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

Любой символ

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

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

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

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

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

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

Символ Описание
\d Соответствует цифре. Эквивалентно
\D Соответствует нецифровому символу. Эквивалентно
\s Соответствует символу пробела. Эквивалентно
\S Соответствует любому непробельному символу. Эквивалентно
\w Соответствует латинской букве, цифре или подчеркиванию. Эквивалентно
\W Соответствует любому символу, кроме латинской буквы, цифры или подчеркивания. Эквивалентно

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

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

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

Квантификация

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

Представление Число повторений Пример Соответствие
{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
Представление Число повторений Эквивалент Пример Соответствие
* Ноль или более {0,} colou*r color, colour, colouur и т. д.
+ Одно или более {1,} colou+r colour, colouur и т. д.
? Ноль или одно {0,1} colou?r color, colour

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

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

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

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

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

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

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

Чтобы выделить отдельные теги, можно применить ленивую версию этого выражения: Ей соответствует не вся показанная выше строка, а отдельные теги:

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

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

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

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

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

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

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

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

Ревнивая квантификация

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

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

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

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

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

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

Группировка

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

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

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

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

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

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

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

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

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

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

Пример Соответствие Создаваемые группы
acc abccaxcc

abccaxcc

abccaxcc

abccaxcc

acc нет
acc abccaxcc

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

axa не найдётся axxxa: все x заняты, и нет возврата внутрь группы

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

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

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

Синтаксис Описание
Включает нечувствительность выражения к регистру символов
Выключает
Включает режим соответствия точки символам переноса строки и возврата каретки
Выключает
Символы ^ и $ вызывают соответствие только после и до символов новой строки
с началом и концом строки
Включает режим без учёта пробелов между частями регулярного выражения и позволяет использовать # для комментариев
Выключает

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

Комментарии

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

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

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

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

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

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

Представление Вид просмотра Пример Соответствие
Позитивный просмотр вперёд Людовик ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
Негативный просмотр вперёд Людовик ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
Позитивный просмотр назад Иванов Сергей Иванов, Игорь Иванов
Негативный просмотр назад Иванов Сергей Иванов, Игорь Иванов

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

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

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


Просмотров: 7078


<<< Представление символов в регулярных выражениях
Символы-джокеры >>>