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

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

Зачем?

Насколько я понимаю – для того, чтобы минимальным количеством кода находить информацию в тексте. Это, в свою очередь повышает эффективность кода. То есть, мы просто используем специальные функции (в каждом языке свои), для поиска “кусочков информации”, которые иногда кодируем с помощью специальных так называемых метасимволов. То есть, можно, например, искать слово “Alena”, а можно написать ^А[\w]+а$. Cмысл в том, что информация, которую мы ищем может быть закодирована с помощью специальных символов, называемых метасимволами.

Самый простой пример в обобщенном виде

Некоторые функции ищут несколько совпадений, хранят их в массивах, но это уже другая история. Самое главное в регулярных выражениях как говорит Дж. Фридл в своей книге – регулярные выражения это мини-язык программирования.

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

1. Литералы. Иными словами, то, что мы ищем пишем как есть. Например “Алена”.

2. Метасимволы. Там, где возможно, кодируем информацию с помощью специальных метасимволов.

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

Основные метасимволы

Символ Значение Пример
. Один любой символ Ввели “точку”, для функции поиска это означает ищем любой символ
[…] Символьный класс Св[ея]тогор – в данном примере функция поиска будет искать “Светогор” и “Святогор”. Также возможно указание диапазонов символов [А-Яа-я]
[^…] Инвертированный символьный класс Св[^я]тогор – в данном примере функция поиска будет искать “Светогор”, “Свитогор”, “Свютогор”, и так далее, все сочетания, кроме “Святогор”, Другой пример [^0-9] – означает все, кроме цифр
^ Позиция в начале строки В строке “Авторское право” функция с регулярным выражением “^Авторское” покажет True
$ Позиция в конце строки В строке “Авторское право” функция с регулярным выражением “право$” покажет True
| Вертикальная черта [Ананас|Абрикос] – найдет в тексте Ананас или абрикос
\b Граница слова a\b – найдет любое слово, заказнчивающееся на “а”
\B Не граница слова \Ba\B – найдет символ a между границами слова
() Круглые скобки Позволяют группировать рег. выражения и определять приоритеты. Например, выражение (тр[ау]м-?)* найдёт последовательность вида трам-трам-трумтрам-трум-трамтрум.

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

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

Квантификаторы

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

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

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

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

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

Список литературы

Какие книги / статьи я прочитал на тему регулярных выражений?

  1. Дж. Фридл, “Регулярные выражения” (легко ищется в интернете)
  2. Статью Игоря Антонова “Регулярные выражения в Delphi”
  3. Статью на Википедии “Регулярные выражения
This entry was posted in Delphi, Без рубрики, Регулярные выражения. Bookmark the permalink.