Регулярные выражения на примерах

Регулярное выражение - это шаблон, применяемый к заданному тексту слева направо.
Сила регулярных выражений исходит из возможности использовать условия и повторения в шаблоне. Они записываются при помощи метасимволов, которые интерпретируются специальным образом.
Существуют два различных набора метасимволов: те, которые используются внутри квадратных скобок, и те, которые используются вне квадратных скобок. Рассмотрим их более детально. Вне квадратных скобок используются следующие метасимволы:
Вне квадратных скобок используются следующие метасимволы:
\ — общий экранирующий символ, допускающий несколько вариантов применения
^ — декларирует начало данных (или линии, в многострочном режиме)
$ — декларирует конец данных (или линии, в многострочном режиме)
. — соответствует любому символу, кроме перевода строки (по умолчанию)
[ — начало описания символьного класса
] — конец описания символьного класса
| — начало ветки условного выбора
( — начало подмаски
) - конец подмаски
? — расширяет смысл метасимвола '(' , квантификатор, означающий ноль либо одно вхождение, квантификатор жадности
*— квантификатор, означающий ноль или более вхождений
+ — квантификатор, означающий одно или более вхождений
{ — начало количественного квантификатора
} — конец количественного квантификатора
Часть шаблона, заключенная в квадратные скобки, называется символьным классом. Внутри символьных классов используются следующие метасимволы:
\ — общий экранирующий символ
^ — означает отрицание класса, допустим только в начале класса
— — означает символьный интервал
] — завершает символьный класс
Модификаторы
Символ «минус» (-) меред модификатором (за исключением U) создаёт его отрицание.
g — глобальный поиск (обрабатываются все совпадения с шаблоном поиска)
i — игнорировать регистр
m — многострочный поиск
s — текст воспринимается как одна строка, спец символ «точка» (.) будет вкючать и перевод строки
u - используется кодировка UTF-8
U — инвертировать жадность
x — игнорировать все неэкранированные пробельные и перечисленные в классе символы
Спецсимволы
Аналог Описание() подмаска, вложенное выражение
[] — групповой символ
{a,b} — количество вхождений от «a» до «b»
| — логическое «или», в случае с односимвольными альтернативами используйте []
\d [0-9] — десятичная цифра
\D [^\d] — любой символ, кроме десятичной цифры
\f — конец (разрыв) страницы
\n — перевод строки
\pL - буква в кодировке UTF-8 при использовании модификатора u
\r — возврат каретки
\s[ \t\v\r\n\f] — пробельный символ
\S[^\s] - любой символ, кроме пробельного
\t — табуляция
\w [0-9a-z_] — любая цифра, буква или знак подчеркивания
\W [^\w] — любой символ, кроме цифры, буквы или знака подчеркивания
\v — вертикальная табуляция
Спецсимволы внутри символьного класса
^[^da] — отрицание, любой символ кроме «d» или «a»
-[a-z] — интервал, любой символ от «a» до «z»
Примеры регулярных выражений
Как известно, регулярные выражения не «привязаны» к какому-то определенному языку программирования, поэтому вы можете использовать приведенные ниже примеры выражений при разработке проектов на различных языках. Например, на JavaScript, PHP или Python.
Проверка надежности пароля
^(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8}$
Надежность пароля - довольно субъективное понятие, поэтому не существует универсального решения для проверки. Однако, приведенный выше пример регулярного выражения может стать хорошей отправной точкой, если вы не желаете придумывать выражение для проверки пароля с нуля.
Код цвета в шестнадцатеричном формате
\#([a-fA-F]|[0-9]){3, 6}
Шестнадцатеричные коды цветов используются при веб-разработке очень часто. Это регулярное выражение может быть поможет сравнить: совпадает ли какая-либо строка с шаблоном шестнадцатеричного кода.
Проверка адреса электронной почты
/[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}/igm
Одной из самых распространенных задач при разработке является проверка соответствия введенной пользователем строки формату адреса электронной почты. Существует множество различных вариантов выражений для решения этой задачи, автор этой статьи предлагает свой оригинальный вариант.
IP-адрес (v4)
/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/
Как e-mail может использоваться для идентификации посетителя, так IP-адрес является идентификатором конкретного компьютера в сети. Приведенное регулярное выражение проверяет соответствие строки формату IP-адреса v4.
Разделитель в больших числах
/\d{1,3}(?=(\d{3})+(?!\d))/g
Традиционными разделителями в больших числах являются запятые, точки или другие знаки, повторяющиеся в числе через каждые 3 символа. Приведенный код регулярного выражения работает с любым числом и любым определенными вами символами для разделения трехзначных частей в больших числах: тысячах, миллионах и т.п.
Добавление протокола перед гиперссылкой
if (!s.match(/^[a-zA-Z]+:\/\//)){ s = 'http://' + s;}
Независимо от того, с каким языком вы работаете: JavaScript, Ruby или PHP, это регулярное выражение может оказаться очень полезным. С его помощью проверяется любой URL-адрес на наличие в строке протокола, и если протокол отсутствует, указанный код добавляет его в начало строки.
«Вытягиваем» домен из URL-адреса.
/https?:\/\/(?:[-\w]+\.)?([-\w]+)\.\w+(?:\.\w+)?\/?.*/i
Как известно, любой URL-адрес состоит из нескольких частей: вначале указывается протокол (HTTP или HTTPS), иногда за ним идет субдомен, а в завершении добавляется путь к странице. Вы можете использовать это выражение, чтобы вернуть только доменное имя, исключив все остальные части адреса.
Сортировка ключевых фраз по количеству слов
^[^\s]*$ //соотв. одному ключевому слову
^[^\s]*\s[^\s]*$ //соотв. фразе из 2 ключевых слов
^[^\s]*\s[^\s]* //соотв. фразе, содержащей по крайней мере 2 кючевых слова
^([^\s]*\s){2}[^\s]*$ //соотв. фразе из 3 ключевых слов
^([^\s]*\s){4}[^\s]*$ //соотв. фразе из 5 и более ключевых слов
Это действительно полезные выражения для пользователей Google Analytics и инструмента для веб-мастеров. Ведь с помощью них можно отсортировать ключевые фразы, используемые посетителями при поиске по количеству слов, входящих в них.
Выражения могут проверять фразы, содержащие определенное количество слов (например, 5), а также фразы количество слов в которых более двух, трех и т.д. Одно из самых мощных выражений, используемое для сортировки данных аналитики.
Поиск валидной строки Base64 в PHP
\?php[ \t]eval\(base64_decode\(\'(([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?){1}\'\)\)\;
Если вы являетесь PHP-разработчиком, то иногда вам может понадобиться найти объект, закодированный в формате Base64. Указанное выше выражение может использоваться для поиска закодированных строк в любом PHP-коде.
Проверка телефонного номера
^\+?\d{1,3}?[- .]?\(?(?:\d{2,3})\)?[- .]?\d\d\d[- .]?\d\d\d\d$
Это регулярное выражение применяется для проверки любого номера телефона, прежде всего, американского формата телефонных номеров.
Начальные и конечные пробелы
^[ \s]+|[ \s]+$
Используйте это регулярное выражение для того, чтобы избавиться от начальных и конечных пробелом в строке. Это не особо распространенная задача, но иногда это выражение может быть полезным. Например, при получении данных из БД или передачи строки скрипту в другой кодировке.
«Вытягиваем» HTML-код изображения
\< *[img][^\>]*[src] *= *[\"\']{0,1}([^\"\'\ >]*)
Если по какой-либо причине вам необходимо «вытянуть» HTML-код изображения прямо из кода страницы, это регулярное выражение станет для вас идеальным решением. Хотя оно может без проблем работать на стороне сервера, для фронтенд-разработчиков приоритетней будет использовать метод attr() библиотеки jQuery вместо указанного регулярного выражения.
Проверка почтового индекса (Zip Code)
^\d{5}(?:[-\s]\d{4})?$
Автор этого регулярного выражения не только придумал его, но и еще нашел время его описать. Это выражение будет полезно вам, если вы проверяете совпадение строки со стандартным пятизначным индексом или его удлиненным вариантом, содержащим 9 знаков. Обращаем ваше внимание, что это выражение подходит только для проверки американских почтовых индексов. Для индексов других стран необходима настройка.
Поиск CSS-атрибутов
^\s*[a-zA-Z\-]+\s*[:]{1}\s[a-zA-Z0-9\s.#]+[;]{1}
Ситуация, когда придется воспользоваться указанным регулярным выражением, может сложиться очень редко, но не факт что не сложится никогда. Этот код можно использовать когда будет необходимо «вытянуть» какое-либо CSS-правило из списка правил для какого-нибудь селектора.
Удаление комментариев в HTML
<!--(.*?)-->
Если вам необходимо удалить все комментарии из блока HTML-кода, воспользуйтесь этим регулярным выражением. Чтобы получить желаемый результат, вы можете воспользоваться PHP-функцией
Проверка версии Internet Explorer
^.*MSIE [5-8](?:\.[0-9]+)?(?!.*Trident\/[5-9]\.0).*$
Несмотря на то, что Microsoft выпустил новый браузер Edge, многие пользователи до сих пор пользуются Internet Explorer. Веб-разработчикам часто приходится проверять версию этого браузера, чтобы учитывать особенности разных версий при работе над своими проектами.
Вы можете использовать это регулярное выражения в JavaScript-коде чтобы узнать какая версия IE (5-11) используется.
«Вытягиваем» цену из строки
/(\$[0-9,]+(\.[0-9]{2})?)/
Цена какого-либо товара может быть указана в различных форматах: в ней могут встречаться запятые, знаки после запятой и символы валюты.
Указанное выше регулярное выражение учитывает различные форматы отображения цены, с его помощью вы сможете «вытянуть» цену из любой символьной строки.
Разбираем заголовки в e-mail
/\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b/i
С помощью этого небольшого выражения вы сможете разобрать заголовок e-mail сообщения, чтобы извлечь оттуда список адресатов. Выражение может быть использовано и в случае, если адресатов несколько.
Вместо регулярных выражений, для разбора заголовков e-mail вы можете воспользуйтесь библиотекой на PHP.
Соответствие имени файла определенному типу
/^(.*\.(?!(htm|html|class|js)$))?[^.]*$/i
Если в вашем приложении существует возможность загрузки файлов на сервер, это регулярное выражение может помочь вам проверить файлы перед тем как посетитель их загрузит.
С помощью этого кода можно получить расширение загружаемого файла и проверить присутствует ли оно в списке разрешенных к загрузке.
Соответствие строки формату URL
/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi
Регулярное выражение может проверять URL-адреса с указанием протоколов HTTP и HTTPS на предмет соответствия синтаксису доменов TLD.