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, за подробностями отправляю вас к книге Фридл — Регулярные выражения.

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