Заинтересовался темой регулярных выражений. Серию постов про регулярные выражения, пишу для себя, чтобы разобраться и систематизировать информацию. Но если для Вас пост окажется полезным – буду рад.
Зачем?
Насколько я понимаю – для того, чтобы минимальным количеством кода находить информацию в тексте. Это, в свою очередь повышает эффективность кода. То есть, мы просто используем специальные функции (в каждом языке свои), для поиска “кусочков информации”, которые иногда кодируем с помощью специальных так называемых метасимволов. То есть, можно, например, искать слово “Alena”, а можно написать ^А[\w]+а$. Cмысл в том, что информация, которую мы ищем может быть закодирована с помощью специальных символов, называемых метасимволами.
Самый простой пример в обобщенном виде
1 |
Функция поиска регулярного выражения ('Текст, который мы ищем'): тип функции; |
Некоторые функции ищут несколько совпадений, хранят их в массивах, но это уже другая история. Самое главное в регулярных выражениях как говорит Дж. Фридл в своей книге – регулярные выражения это мини-язык программирования.
Структура регулярных выражений
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 с регулярными выражениями.
Список литературы
Какие книги / статьи я прочитал на тему регулярных выражений?
- Дж. Фридл, “Регулярные выражения” (легко ищется в интернете)
- Статью Игоря Антонова “Регулярные выражения в Delphi”
- Статью на Википедии “Регулярные выражения“