RegExp за 10 минут

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

Мы будем рассматривать синтаксис PCRE, как наиболее распространённый. Он используется в PHP, например см. preg_match.  Так же библиотека легко собирается на Си.

Чтобы быстро понять суть регулярок, пробуйте все примеры на сайте regex101.com

Синтаксис PCRE

Метасимволы (символы для обозначения других символов)

.(точка) любой символ
\экранирование следующего спец-символа
^начало строки
$конец строки
[]класс символов, напр. [12356789] или [0-9] – любой от 0-9.
[^n]любой символ кроме n
|логическое ИЛИ. например (vx|av) обозначает строку vx или av
()группировка символов

Модификаторы, пишутся после метасимвола.

Обозначают количество его вхождений.

*(звезда) предыдущий символ или группа ноль или  более раз
+пред. символ или группа один или более раз
?пред. символ или группа 1 или 0 раз
{n}пред. символ повторяется n раз
{n,}пред. символ повторяется n и более раз
{n,m}пред. символ повторяется от n до m раз

Так же используются шаблоны

\tтабуляция
\nперевод строки
\rперевод каретки
\x00число в 16-ричной записи
\wлюбая буква\цифра и _
\Wлюбой символ кроме букв\цифр и _
\sпробельный символ
\Sлюбой не пробельный символ
\dлюбая цифра
\Dлюбой символ кроме цифр
\bграница слова
\Bлюбой кроме границы слова
\Aначало текста
\Zконец текста

Опции

В php записываются после рег выражения.

В си это указывается в списке параметров pcre_compile()

iигнорировать регистр символов
mсчитать строку многострочной
sсчитать строку однострочной
uподдержка юникода

“Жадность”

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

Возьмём строку..

!-----------!----------!

В обычном режиме руглярка захватит строку целиком

!(.*)!

В не-жадном режиме только до середины

!(.*?)!

жадный https://regex101.com/r/cA5xZ7/1

не жадный https://regex101.com/r/oQ2sI0/1

Примеры

Выдернуть заголовок из HTML-страницы

<HTML><HEAD><TITLE>vxlab<TITLE>

Для этого подходит след рег. выражение.

TITLE>(.*)<\/TITLE
  • (.*) – выбрать группу любых символов любой длины
  • \/ – экранированный слеш, он является метасимволом поэтому его нужно экранировать
  • остальной текст представляет сам себя

Попробуйте сами! https://regex101.com/r/kN5dR0/1

Поиск email  в тексте

some text
spam@mail.ru
some text

регулярка…

[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+
  • [a-zA-Z0-9_.+-]+  подряд идущие символы из [] 1 и более раз
  • @ просто символ собаки
  • [a-zA-Z0-9-]+   подряд идущие символы из [] 1 и более раз
  • \. экранированная точка, воспринимая как простая точка
  • [a-zA-Z0-9-.]+  подряд идущие символы из [] 1 и более раз

https://regex101.com/r/cZ7mN3/2

Подводя итог

Это далеко не все возможности PCRE, за подробностями отправляю вас к книге Фридл – Регулярные выражения.

Добавить комментарий