Содержание

Визуальный генератор регулярных выражений / Хабр

Все разработчики рано или поздно сталкиваются с регулярными выражениями. Практически в 100% случаев нам совершенно не нравится их составлять, считая это побочной работой, не связанной с программированием.

Большинство из нас, впервые столкнувшись с данной проблемой, начинают забивать в поисковых системах что-то типа: «regexp online generator» и к своему великому сожалению осознают что гугл сломался все результаты в поиске являются сервисами для проверки корректности уже составленного регулярного выражения (или я плохо гуглил).

А как же составить это самое регулярное выражение?

До недавнего времени существовало 2 ответа на этот вопрос:

  1. Изучить документацию по регулярным выражениям и составить регулярку самому
  2. Попросить кого-то более опытного сделать это за вас

Теперь, после нескольких месяцев разработки, рад представить и 3-й ответ:

» Генератор регулярных выражений

История

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

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

Но эта проблема его очень сильно зацепила и вот теперь, наконец, он рад представить вам плоды своих трудов.

Начнем

Для начала решил сделать веб-сервис. Хотелось сделать максимально просто (для более широкого круга людей), чтобы своё правило для валидации смогли составить не только программисты, но и люди которые далеки от программирования (модераторы/администраторы).

Вот сам интерфейс:

Как и ожидалось, новому пользователю вообще ничего непонятно и поэтому пришлось разработать вводный интерактивный курс:

Всегда выступаю против модальных окон и попапов, но в этом случае мне кажется их все же целособразно использовать. Можно назвать это «приветственным сообщением».

А вот и сам интерактивный курс, точнее его часть:

Также вы можете включить отображение отдельных подсказок вне зависимости пройдете ли вы вводный курс, либо откажитесь от него.

А что же насчет функционала?

Первое что бросается в глаза — это «Примеры» и сделано это неспроста. Для начала, я настоятельно рекоммендую выбрать наиболее близкий для вашей задачи пример. Вы можете просто переключиться между некорректным и корректным вариантом для более простого понимания примеров. Затем можете изменить выбранный вами пример так, как сами пожелаете. Со временем список примеров будет расширяться:
Далее идет то, ради чего это всё и затевалось — сгенерированное Регулярное Выражение:

Здесь хотелось бы немного остановиться и рассказать подробнее.

С самого начала мне хотелось создать инструмент не ограничивающий пользователей в создании многосложных регулярок и в то же время сделать интерфейс максимально простым. А на деле, сколько раз кардинально изменялся интерфейс я уже и со счета сбился. Также пришлось несколько раз переписывать часть логики самого генератора (ядро). И не потому что архитектура была плохо продумана, а из-за того что некоторые варианты просто не были учтены. А вариантов — огромное множество.

Еще хотелось бы рассказать о возможностях. На данный момент можно создавать регулярку с группами/подгруппами, определять опциональные части (не обязательные), указывать конкретные символы (у остальных будет определяться тип), указать тип — «любой символ» и блокировать определенные символы в конкретной части регулярки. Вы можете довольно просто создать регулярку не только для слова, но и для словосочетания и даже предложения. Доступна генерация регулярок как на латинице и так на кириллице (по отдельности и вместе). По мере добавления дополнительных локализаций интерфейса, планируется поддержка регулярок и для других письменностей.

Кстати, не пугайтесь что регулярное выражение всегда красного цвета. Это не символизирует ошибку, а сделано лишь для того, чтобы акцентировать ваше внимание на этой крайне важной информации.

Далее по порядку идет «Тестовое поле»

Здесь происходит проверка введенного тестового значения на соответствие сгенерированному регулярному выражению. И происходит она «на лету». Ничего нажимать не нужно. Тем самым вы можете гораздо быстрее и удобнее проверить множество вариантов.

Под полем ввода отображается описание автоматически сгенерированного правила.

Есть вариант с описанием правила в виде ошибки, когда введенное тестовое значение не соответствует сгенерированному правилу/регулярке:

На данном примере видно как срабатывает проверка на заблокированные символы:

  • «@» до второй «@»;
  • «—» в любой части имени домена второго уровня;
  • «-» в самом конце домена второго уровня, непослредственно перед символом «.»;

Описание заблокированных символов в правиле отображается не очень понятно. Чуть позже оно будет приведено к такому же виду как и описание основной части правила.

Также есть вариант с описанием правила в отдельном блоке, когда введенное тестовое значение соответствует сгенерированному правилу/регулярке:

Хотелось бы разъяснить значение цветов с частями правила:

  1. зеленый — правильно
  2. желтый — опционально
  3. красный — некорректно

Сгенерированное регулярное выражение может иметь не только обязательные части, но также и опциональные. Хочу также отметить, что автоматическое описание правила делалось именно для будущего плагина, но отлично показало себя и в данном веб-сервисе.

Ядро (UI)

Вот и наконец мы добрались до последнего блока по порядку, но не по значению. Я лично считаю этот блок — ядром всего сервиса. Именно здесь Генератор получает все необходимые входные данные, которые впоследствии обрабатывает и выдает уже готовый результат. Кстати, вся логика реализована только на клиенте. Веб сервис вообще не имеет серверного кода.

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

Здесь можно очень долго и нудно рассказывать что и как нужно вводить, но мне кажется это будет намного проще понять с помощью примеров, которых там довольно много. И вообще, материала с описанием как и что работает хватит еще на одну большую статью.

А ты не забыл сохраниться?

После того, как мы нажали кнопку «Генерировать», у нас сгенерировалось регулярное выражение. Теперь мы можем сохранить его. На всякий случай хочу уточнить что сохраняется оно только в памяти браузера (localstorage).

При нажатии на кнопку «Сохранить» появляется диалоговое окно:

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

На самом деле, как в случае с примерами так и с пользовательскими правилами, сохраняется не сгенерированное правило, а просто входные данные и каждый раз когда вы переключаете правило — срабатывает логика генератора. Это очень удобно при исправлении багов в логике самого генератора. Тем самым даже сохраненные правила будут работать с последней версией уже исправленного генератора.

Дополнительные возможности

Я расположил их по приоритету:

  1. Автоматическое сохранение данных в Url параметры. И происходит это сразу же после нажатия на кнопку «Генерировать», либо при переключении примеров или сохраненных правил. Вы можете скинуть кому-то ссылку и при открытии страницы другой пользователь увидит именно то, что вы вводили раннее. Это довольно удобно.
  2. Полная локализация всего контента. Существующие модули локализации мне сильно не нравились, поэтому ваш покорный слуга создал свой велосипед очень простой модуль. Всего десяток строк кода. Выбранный язык cчитывается из Url и записывается в Url, сохраняется в Localstorage. Особенно приятно добавлять новые языки, т.к. текст берется только из одного очень простого JSON файла для соответствующего языка. Отдал файлик переводчикам — получил еще один язык.
  3. Извещение о новой версии приложения. Данный веб-сервис — это одностраничное веб приложение (буквально). Из личного опыта знаю что пользователь может месяцами не перезагружать одностраничное приложение и это как раз правильно. Но что делать если вышла новая версия? Как известить об этом пользователя? — Очень просто. Был разработан модуль, который опрашивает сохраненный JSON файл с заданным интервалом времени и как только записанная новая версия не соответствует предыдущей — показывается вот такое извещение:

Технологии

Вот основной стек технологий с помощью которого удалось всё это реализовать:

  • TypeScript 2.0 + SystemJS
  • Angular 1.5 (с компонентами)
  • Angular-Material 1.x
  • IntroJS

Код написан в полном Angular 2 Code Style (даже с декораторами), что в будущем позволит очень просто мигрировать (жду только Material2).

Заключение

В дальнейших планах — сделать полноценный плагин, который позволит задавать правила валидации одновременно для клиента и для сервера прямо из интерфейса. Мне кажется это окажется очень удобным и практичным решением. Затем можно развить эту идею и создать даже «Visual Form Builder» на основе как-бы стандарта: «JSON Schema», с которым мне пришлось поработать в свое время.

Если вы захотите сделать что-то аналогичное, я буду только за и даже помогу советами. Считаю что: «Сама идея практически ничего не стоит, стоит ее непосредственная реализация».

В заключение, хочу позволить себе небольшое отступление. Если ты разработчик-мечтатель, как и автор статьи, который получает кайф от своей работы, особенно когда она бросает тебе вызов и хоть немного, но все же решает проблемы других людей, тогда ты скорее всего на правильном пути. Хуже, когда такому человеку приходится гнаться за деньгами, какими-то материальными благами, чтобы соответствовать непонятным социальным стандартам или выполнять скучную, глупую и рутинную работу чтобы просто прокормить себя, свою семью. Кажется не правильным жертвовать своими мечтами, идеями, стремлениями и временем в угоду простым бумажкам. Но в то же время автор статьи никого не побуждает прямо сейчас всё взять и бросить. Каждый должен сделать свой выбор сам и когда для этого наступит действительно подходящее время.

Regex Tester — калькулятор регулярных выражений

Интернет регулярно тестер выражение (ака регулярное выражение калькулятор ) позволяет выполнять различные регулярные действия выражении по данному тексту:

  • Выделите регулярное выражение — подчеркивает части текста, которая соответствует регулярное выражение
  • Extract регулярное выражение -.. экстракты, соответствующие части в таблице с каждой группы регулярных выражений в колонке
  • Заменить регулярное выражение — заменяет соответствующие части текста с заданной строки. Группа выражения (например, 1 $) не допускается.

Регулярный калькулятор выражений поддерживает флаги как глобальное матча (выполнения регулярных выражений действие на весь текст, а не первого вхождения), игнорировать регистр ( случай, предоставленной тексте, будут проигнорированы) и многострочный матч (выполнения регулярных выражений вычисления на границах между строк).

Правила Регулярных выражений
Правило Значение
^ соответствует началу строки
$ соответствует концу строки
* соответствует предыдущему символу 0 или более раз
+ соответствует предыдущему символу 1 или более раз
? соответствует предыдущему символу 0 или 1 раз
. соответствует одному любому символу, кроме newtdne
(x) Матчи х и помнит соответствия expresssion
(?:x) Матчи х и не помнит соответствия expresssion
x(?=y) Матчи х, если оно сопровождается у
x(?!y) Матчи х, если она не сопровождается у
{n} предыдущий символ повторяется n раз
{n,m} предыдущий символ повторяется от n до m раз
[abc] соответствует любому одному символу в скобках
[^abc] соответствует любому одному символу, кроме тех, что указаны в скобках
\b соответствует границе слова
\B соответствует границе не слова
\d Совпадает с цифрой
\D соответствует не цифре
\s соответствует символу пробела
\S соответствует символу
\t соответствует символу табуляции
\w matches an alphanumeric character or underscore
\W соответствует символу, который не соответствует \w
Примеры регулярных выражений
Expression Meaning
[0-9]{4} соответствует год, пример: 2010
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3} совпадает с IP-адрес, например: 192.168.10.1.
([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z]{2,} соответствует доменному имени, например: www.yahoo.com

азы для новичков / Блог компании OTUS. Онлайн-образование / Хабр

В преддверии старта нового потока по курсу «Backend-разработчик на PHP», а также смежного с ним курса «Framework Laravel», хотим поделиться статьей, которую подготовил наш внештатный автор.

Внимание! данная статья не имеет отношения к программе курса и будет полезна только для новичков. Для получения более углубленных знаний приглашаем вас посетить бесплатный двухдневный онлайн интенсив по теме: «Создание Telegram-бота для заказа кофе в заведении и оплаты онлайн». Второй день интенсива будет проходить тут.


Всем привет! Всех с наступившим [20]{2,}0 годом. Сегодня я хочу затронуть тему, которая иногда является темой для шуток от «Да зачем тебе все это учить, если есть уже есть готовые решения» до «может тебе еще и весь Perl выучить?». Однако время идет, множество программистов начинают осваивать регулярные выражения, а на Хабре нет ни одной свежей (хоть регулярные выражения не слишком изменились за последнее время) статьи на этой тематику. Пришло время написать ещё одну!

Регулярные выражения в отрыве от их конкретной реализации

Регулярные выражения (обозначаемые в английском как RegEx или как regex) являются инструментальным средством, которое применяется для различных вариантов изучения и обработки текста: поиска, проверки, поиска и замены того или иного элемента, состоящего из букв или цифр (или любых других символов, в том числе специальных символов и символов пунктуации). Изначально регулярные выражения пришли в мир программирования из среды научных исследований, которые проводились в 50-е годы в области математики.

Спустя десятилетия принципы и идеи были перенесены в среду операционной системы UNIX (в частности вошли в утилиту grep) и были реализованы в языке программирования Perl, который на заре интернета широко использовался на бэкенде (и по сей день используется, но уже меньше) для такой задачи, как, например, валидация форм.

Если они вроде простые, тогда почему такие страшные на первый взгляд?

На самом деле любое выражение может быть «регулярным» и применяться для проверки или поиска каких-либо символов. Например, слова Pavel или [email protected] тоже могут использоваться как регулярки, только, понятное дело, в довольно узком ключе. Для проверки работы регулярных выражений в среде PHP без запуска своего сервера или хостинга вы можете воспользоваться следующим онлайн сервисом (вот только на нем у меня не работала обработка русских символов). Для начала в качестве регулярного выражения мы используем просто Pavel.

Положим у нас есть следующий текст:

Pavel knows too much. Pavel using nginx and he’s not rambler.

Сейчас регулярные выражения нашли оба вхождения слова Pavel. Здорово, но звучит не очень полезно (разве что только вы зачем-то пытаетесь проанализировать что-то вроде количества упоминания слова сударь в Войне и Мире через Vim и Python, но тогда у меня к вам вопросов нет).

Вариативность выражения

Если ваше регулярное выражение вариативно (например, вам известна только некоторая его часть и нужно найти количество вхождений годов, начиная от 2000 и заканчивая 2099), то мы можем использовать следующее регулярное выражение: 20..

Текст: Молодые писатели пишут много чего. Например писатель 2002 года рождения очень отличается от 2008 и 2012

Здесь у нас с помощью регулярного выражения найдутся все годы, но пока в этом нет никакого смысла. Скорее всего нам не нужны годы дальше 2012 (хотя молодые писатели младше 8 лет могут обидеться, но не об этом сейчас). Стоит изучить наборы символов, но об этом попозже, потому как сейчас поговорим про другую важную часть регулярных выражений: экранирование метасимволов.

Представим, что нам нужно найти количество вхождений файлов с расширением .doc (допустим, мы экспортируем только определенные файлы загруженные в нашу базу данных). Но ведь точка обозначает просто любой символ? Так как же быть?

Тут к нам на помощь приходит экранирование метасимволов обратным слешем \. Теперь выражение \.doc будет достаточно успешно искать любой текстовое упоминание с расширением .doc:

Регулярное выражение: \.doc

Текст: kursach.doc , nepodozritelneyfail.exe, work.doc, shaprgalka.rtf doc

Как видите, мы успешно можем найти количество файлов с расширением .doc в списке. Однако мы не сможем вытащить полные имена файлов с помощью данного регулярного выражения, например, в массив. Пришло время взглянуть на наборы символов.

Совпадение с целым набором символов

В регулярных выражениях совпадения с набором обеспечивается с помощью метасимволов — квадратных скобочек [ ]. Любые два символа ASII могут быть указаны в качестве начала и конца диапазона. Для простой реализации, положим, мы хотим найти все пронумерованные файлы от 0 до 9 с расширением .jpg.

Регулярное выражение: [0-9]\.jpg

Текст: 1.jpg, 2.jpg, 3.jpg, photo.jpg, anime.jpg, 8.jpg, jkl.jpg

Стоит отметить, что имя файлов из более 1 цифры наше регулярное выражение не охватит. Про множественный выбор будет чуть ниже, а пока представим, что нам вдруг понадобилось добиться обратного результата. Добавим метасимвол ^ (у которого, самое противное, в регулярных выражениях есть аж две функции). Чтобы воспользоваться им как исключением, нужно добавить его именно внутрь нашего набора:

Регулярное выражение: [^0-9]\.jpg

Текст: 1.jpg, 2.jpg, 3.jpg, photo.jpg , anime.jpg , 8.jpg, jkl.jpg

Но без множественного выбора это конечно неполноценные выражения.

Полезные таблицы

Приведем таблицу метасимволов:

Таблица пробельных метасимволов

Множественный выбор: делаем простую валидацию

Вооружившись полученными знаниями, попробуем сделать регулярное выражение, которое находит, например, слова короче 3 букв (стандартная задача для антиспама). Если мы попробуем использовать следующее регулярное выражение — \w{1,3} (в котором метасимвол \w указывает на любой символ, а фигурные скобки обозначают количество символов от сколько до скольки, то у нас выделятся все символы подряд — нужно как-то обозначить начало и конец слов в тексте. Для этого нам потребуется метасимвол \b.

Регулярное выражение: \b\w{1,3}\b:

Текст: good word
not
egg

Неплохо! Теперь слова короче трех букв не смогут попадать в нашу базу данных. Посмотрим на валидацию почтового адреса:

Регулярное выражение: \[email protected]\w+\.\w+

Требования: в электронной почте в начале должен быть любой символ (цифры или буквы, ведь электронная почта, которая состоит только из цифр в начале, встречается довольно часто). Потом идет символ @, затем — сколько угодно символов, после чего экранированная точка (т.е. просто точка) и домен первого уровня.

Подробнее рассмотрим повторение символов

Теперь давайте поподробнее разберем, как можно в регулярных выражениях задать повторение символов. К примеру вы хотите найти любые комбинации цифр от 2-6 в тексте:

Регулярное выражение: [2-6]+

Текст: Here are come’s 89 different 234 digits 24 .

Давайте я приведу таблицу всех квантификаторов метасимволов:

В применении квантификаторов нет ничего сложного. Кроме одного нюанса: жадные и ленивые квантификаторы. Приведем таблицу:

Ленивые квантификаторы отличаются от жадных тем, что они выхватывают минимальное, а не максимальное количество символов. Представим, что есть у нас задача найти все теги заголовков h2-h6 и их контент, а весь остальной текст не должен быть затронут (я умышленно ввел несуществующий тэг h7, чтобы не мучаться с экранированием хабровских тэгов):

Регулярное выражение: <h[1-7]>.*?<\/h[1-7]>

Текст: <h7> hello </h7> lorem ipsum avada kedavra <h7> buy</h7>

Все сработало успешно, однако только благодаря ленивому квантификатору. В случае применения жадного квантификатора у нас выделился бы весь текст между тегами (полагаю, в иллюстрации это не нуждается).

Границы символьных строк

Границы символьных строк мы уже использовали выше. Приведем здесь более подробную таблицу:

Работа с подвыражениями

Подвыражения в регулярных выражениях делаются с помощью метасимвола группировки ().
Приведем пример регулярного выражения, которое универсально может находить различные вариации IP — адресов.

Регулярное выражение: (((25[0-5])|(2[0-4]\d)|(1\d{2})|(\d{1,2}))\.){3}(((25[0-5]|(2[0-4]\d)|(1\d{2})|(\d{1,2}))))

Текст: 255.255.255.255 просто адрес
191.198.174.192 wikipedia
87.240.190.67 vk
31.13.72.36 facebook

Здесь используется логический оператор | (или), который позволяет нам составить регулярное выражение, которое соответствует правилу, по которому составляются IP- адреса. В IP адресе должно быть от 1 и до 3 цифр, в котором число из трех чисел может начинаться с 1, с 2 (или тогда вторая цифра должна быть в пределах от 0 и до 4), или начинаться с 25, и тогда 3 цифра оказывается в пределах от 0 и до 5. Также между каждой комбинацией цифр должна стоять точка. Используя приведенные выше таблицы, постарайтесь сами расшифровать регулярное выражение сверху. Регулярные выражения в начале пугают своей длинной, но длинные не значит сложные.

Просмотр вперед

Для просмотра выражения на любую комбинацию определенных символов указывается шаблон по которому обнаруживается, но не возвращается, совпадение. По существу, просмотр вперед определяет подвыражение и поэтому он формируется соответствующим образом. Синтаксический шаблон для просмотра вперед состоит из подвыражения, перед которым стоит ?=, а после равно следует сопоставляемый текст.

Приведем конкретную задачу: есть пароль, который должен состоят не менее чем из 7 символов и должен обязательно включать как минимум одну заглавную букву и цифру. Здесь все будет несколько сложнее, потому как пользователь должен иметь возможность поставить заглавную букву как в начале, так и в середине предложения (и тоже самое должно повторяться с буквой).

Следовательно, нам потребуется просмотр выражения вперед. Кроме того, нам нужно разбить на группы знаки. И я хочу ограничить его размеры от 8 и до 22 знаков:

Регулярное выражение: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/

Текст: Qwerty123
Im789098

weakpassword

Особенности работы регулярных выражений именно в PHP

Для изучения работы регулярных выражений в PHP, изучите функции в официальной документации PCRE (Perl Compatible Regular Expressions) которая доступна на официальном сайте. Выражение должно быть заключено в разделители, например, в прямые слеши.

Разделителем могут выступать произвольные символы, кроме буквенно-цифровых, обратного слеша ‘\’ и нулевого байта. Если символ разделителя встречается в шаблоне, его необходимо экранировать \. В качестве разделителей доступны комбинации, пришедшие из Perl: (), {}, [].

Какие функции используются в php? В пакете PCRE предоставляются следующие функции для поддержки регулярных выражений:

  • preg_grep() — выполняет поиск и возвращает массив совпадений.
  • preg_match() — выполняет поиск первого совпадения с помощью регулярных выражений
  • preg_match_all() — выполняет глобальный поиск с помощью регулярных выражений
  • preg_quote() — принимает шаблон и возвращает его экранированную версию
  • preg_replace() — выполняет операцию поиска и замены
  • preg_replace_callback() — тоже выполняет операцию поиска и замены, но используют callback – функцию для любой конкретной замены
  • preg_split() — разбивает символьную строку на подстроки

Для организации совпадения без учета регистра букв служит модификатор i.

С помощью модификатора m можно активировать режим обработки многострочного текста.

Замещающие строки допускается вычислять в виде кода PHP. Для активизации данного режима служит модификатор e.

Во всех функциях preg_replace(), preg_replace_callback() и preg_split() поддерживается дополнительный аргумент, который вводит ограничения на максимальное количество замен или разбиений.

Обратные ссылки могут обозначаться с помощью знака $ (например $1), а в более ранних версиях вместо знака $ применяются знаки \\.

Метасимволы \E, \l, \L, \u и \U не используются (поэтому они и не были упомянуты в этой статье).

Наша статья была бы неполной без классов символов POSIX, которые также работают в PHP (и в общем вполне могут повысить читабельность ваших регулярок, но не все их спешат учить, потому как часто ломают логику выражения).

Под конец приведу пример конкретной реализации регулярных выражений в PHP, используя упомянутые выше реализации. Также я добавил валидацию имени пользователя, чтобы он не смог вводить слишком короткие сочетания букв (ну, положим, это никнеймы, а не имена, имена бывают короче двух букв):

	$pattern_name = '/\w{3,}/';
	$pattern_mail = '/\[email protected]\w+\.\w+/';
	$pattern_password = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/';
	
	if (preg_match($pattern_name, $name) &&
		preg_match($pattern_mail, $mail) &&
		preg_match($pattern_password, $_POST['password'])) {
 # тут происходит, к примеру, регистрация нового пользователя, отправка ему письма, и внесение в базу данных 
		}

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

По традиции, несколько полезных ссылок:

Шпаргалка от MIT по регулярным выражениям

Официальная часть документации php по регулярным выражениям.

На этом все. До встречи на интенсиве!
Второй день интенсива пройдет тут

Помощники в создании регулярных выражений

В настоящее время сложно представить разработку сайтов и приложений без использования регулярных выражений (если только сайт или приложение простенькое). Ведь регулярные выражения представляют собой формальный язык поиска и осуществления манипуляций с подстроками в тексте, который основан на использовании метасимволов (wildcard characters).

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

Интересный конструктор регулярных выражений (regexp online generator) для PHP и Javascript. На момент тестирования не корректно работал с регулярными выражениями для PHP, в которых используются русские символы (возникала ошибка в момент вывода результатов). А так, если откинуть данный момент, то вполне неплохой конструктор, в котором можно по практиковаться с составлением различных выражений.

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

Regular Expression Library

На сайте есть много интересных паттернов регулярных выражений, а также возможность их протестировать прямо на сайте. На данный момент свыше 6500+ регулярных выражений от разных участников проекта. Хорошая возможность подсмотреть или найти для себя нужное регулярное выражение.

Regular Expression Library

PCRE

Еще один простой конструктор регулярных выражений, совместимых с Perl. Вариант для тех, кому не нужно ничего лишнего для создания регулярного выражения.

PCRE

Генератор правил валидации

Под конец написании статьи нашел еще один интересный сервис для создания регулярных выражений из сопоставляемой строки. Для начала работы достаточно ввести значение в данное поле и нажать на кнопку «Генерировать». После чего вы сами увидите появившееся регулярное выражение в поле RegEx. А вот в тестовом поле можно ввести другое значение, если все правильно, то будет выдан результат о корректности заполнения в соответствии с регуляркой.

Конечно, ресурс не является панацеей при создании новых правил, но тем не менее порой помогает быстро создать новое выражение даже не опытному в этой области человеку.

Генератор регулярных выражений

Ну и еще один конструктор регулярных выражений — RegExr. Аналог PCRE, возможно покажется кому-то более удобным.

Regular Expressions 101

Вот недавно нашел еще одного интересного помощника при составлении регулярных выражений. В нем можно выбрать вид регулярных выражений для PHP, Python, JavaScript или Golang. Есть даже небольшая библиотека готовых выражений.

Хочется сказать, что подобных конструкторов много, но я привел самые наиболее интересные. Возможно вы используете какой-то другой — буду рад вашим комментариям. Следите за обновлениями на моем сайте.

6 пунктов, которые помогут легко разобраться с regexp

Давно хотели изучить regexp? Это небольшое руководство поможет разобраться с ними в 6 этапов, а обилие примеров позволит закрепить материал.

Regexp представляет собой группу символов или знаков, которая используется для поиска определенного текстового шаблона.

Регулярное выражение – это шаблон, который сравнивается с предметной строкой слева направо. Словосочетание “regular expression” применяется не так широко, вместо него обычно употребляют “regex” и “regexp”. Регулярное выражение используется для замены текста внутри строки, проверки формы, извлечения подстроки из строки на основе соответствия шаблона и т. д.

Предположим, вы создаете приложение и хотите определить правила, согласно которым пользователи будут выбирать себе имя. Например, мы хотим, чтобы оно содержало буквы, цифры, нижнее подчеркивание и дефисы. Также нам бы хотелось ограничить количество символов в имени пользователя, чтобы оно не выглядело уродливым. Поэтому для проверки будем использовать следующее регулярное выражение:

Это выражение принимает строки john_doe, jo-hn_doe и john12_as. Однако имя пользователя Jo не будет соответствовать этому выражению, потому что оно содержит прописную букву, а также является слишком коротким.

Регулярное выражение — это всего лишь шаблон из символов, который мы используем для выполнения поиска в тексте. Например, регулярное выражение the означает букву t, за которой следует буква h, за которой следует буква e.

"the" => The fat cat sat on the mat.

Регулярное выражение 123 соответствует строке 123. Регулярное выражение сопоставляется входной строке путем сравнения каждого символа в regexp с каждым символом входной строки. Регулярное выражение и входная строка сравниваются посимвольно. Обычно regex чувствительны к регистру, поэтому The не соответствует строке the.

"The" => The fat cat sat on the mat.

Тестировать выражение

Метасимволы служат строительными блоками regexp. Они не являются независимыми и обычно интерпретируются каким-либо образом. Некоторые метасимволы имеют особое значение, а потому помещаются в квадратные скобки. Метасимволы:

Метасимволы Описание
. Любой единичный символ, исключая новую строку.
[ ] Поиск набора символов, помещенных в скобки.
[^ ] Negated character class. Matches any character that is not contained between the square brackets
* 0 или больше повторений предшествующего символа.
+ 1 или больше повторений предшествующего символа.
? Делает предшествующий символ опциональным.
{n,m} Возвращает как минимум «n», но не более «m» повторений предшествующего символа.
(xyz) Находит группу символа в строго заданном порядке.
| Разделяет допустимые варианты.
\ Исключает следующий символ. Позволяет искать служебные символы [ ] ( ) { } . * + ? ^ $ \ |
^ Находит начало введенной строки.
$ Находит конец введенной строки.

2.1 Точка

. — это простейший пример метасимвола. Метасимвол . соответствует любому единичному символу. Например, регулярное выражение .ar означает: любой символ, за которым следует буква a, за которой следует буква r.

«.ar» => The car parked in the garage.

Тестировать выражение

2.2 Интервал символов

Интервал или набор символов также называют символьным классом. Для его обозначения используются квадратные скобки. Чтобы указать диапазон символов внутри класса, необходимо поставить знак тире. Порядок ряда символов в наборе неважен. Так, например, регулярное выражение [Tt]he означает: T или t, за которым следует буква h, за которой следует буква e.

«[Tt]he » => The car parked in the garage.

Тестировать выражение

Стоит отметить, что точка, помещенная в квадратные скобки, означает именно точку, а ничто другое. Таким образом регулярное выражение ar[.] означает строчный символ a, за которым следует буква r, за которой следует точка..

«ar [.]» => A garage is a good place to park a car.

Тестировать выражение

2.2.1 Отрицание набора символов

Обычно символ ^ представляет начало строки, но когда он внутри квадратных скобок, все символы, которые находятся после него, исключаются из шаблона. Например, выражение [^c]ar поможет отыскать все символы кроме c, за которыми следуют а и r.

"[^c]ar" => The car parked in the garage.

Тестировать выражение

2.3 Повторения

Следующие мета-символы + ,* или ? используются для того, чтобы обозначить допустимое количество повторения подшаблона. Их роль зависит от конкретного случая.

2.3.1 Звездочка

Этот символ поможет найти одно или более копий какого-либо символа. Регулярное выражение a* означает 0 или более повторений символа a. Но если этот символ появится после набора или класса символов, тогда будут найдены повторения всего сета. Например, выражение [a-z]* означает любое количество этих символов в строке.

"[a-z]*" => The car parked in the garage #21.

Тестировать выражение

Также символ может быть использован вместе с метасимволом . для подбора строки из любых символов .*.

Еще звездочку можно использовать со знаком пробела \s, чтобы подобрать строку из пробелов. Например, выражение \s*cat\s будет означать 0 или более пробелов, за которыми следует символ с, за ним а и t, а за ними снова 0 либо больше пробелов.

"\s*cat\s*" => The fat cat sat on the concatenation.

Тестировать выражение

2.3.2 Плюс

+ соответствует одному или нескольким повторениям предыдущего символа. Например, регулярное выражение c.+t означает: строчная буква c, за которой следует хотя бы один символ, за которым следует строчный символ t. Необходимо уточнить, что буква t должна быть последней t в предложении.

"c.+t" => The fat cat sat on the mat.

Тестировать выражение

2.3.3. Вопросительный знак

В regexp метасимвол ? делает предшествующий символ необязательным. Этот символ соответствует полному отсутствию или же одному экземпляру предыдущего символа. Например, регулярное выражение [T]?he означает: необязательно заглавную букву T, за которой следует строчный символ h, за которым следует строчный символ e.
"[T]he" => The car is parked in the garage.
Тестировать выражение

"[T]?he" => The car is parked in the garage.

Тестировать выражение

2.4 Скобки

Скобки в regexp, которые также называются квантификаторами, используются для указания допустимого количества повторов символа или группы символов. Например, регулярное выражение [0-9]{2,3} означает, что допустимое количество цифр должно быть не менее двух цифр, но не более 3 (символы в диапазоне от 0 до 9).

"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.

Тестировать выражение

Мы можем убрать второе число. Например, выражение [0-9]{2,} означает 2 или более цифр. Если мы также уберем запятую, то тогда выражение [0-9]{3} будет находить только лишь 3 цифры, ни меньше и ни больше.

"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.

Тестировать выражение

"[0-9]{3}" => The number was 9.9997 but rounded it off to 10.0.

Тестировать выражение

2.5 Символьная группа

Группа символов — это группа подшаблонов, которая записывается внутри скобок (...). Как было упомянуто раньше, если в регулярном выражении поместить квантификатор после символа, он повторит предыдущий символ. Но если мы поставим квантификатор после группы символов, он просто повторит всю группу. Например, регулярное выражение (ab)* соответствует нулю или более повторениям символа «ab». Мы также можем использовать | — метасимвол чередования внутри группы символов. Например, регулярное выражение (c|g|p)ar означает: символ нижнего регистра c, g или p, за которым следует символ a, за которым следует символ r.

"(c|g|p)ar" => The car is parked in the garage.

Тестировать выражение

2.6 Перечисление

В regexp вертикальная полоса | используется для определения перечисления. Перечисление — это что-то вроде условия между несколькими выражениями. Можно подумать, что набор символов и перечисление работают одинаково, но это совсем не так, между ними существует огромная разница. Перечисление работает на уровне выражений, а набор символов на уровне знаков. Например, регулярное выражение (T|t)he|car означает: T или t, сопровождаемая строчным символом h, сопровождаемый строчным символом e или строчным символом c, а затем a и r.

"(T|t)he|car" => The car is parked in the garage.

Тестировать выражение

2.7 Исключение специального символа

Обратная косая черта \ используется в regexp, чтобы избежать символа, который следует за ней. Это позволяет нам указывать символ в качестве символа соответствия, включая зарезервированные { } [ ] / \ + * . $ ^ | ?. Чтобы использовать специальный символ в качестве подходящего, перед ним нужно поставить \.

Например, регулярное выражение . используется для нахождения любого единичного символа. Регулярное выражение (f|c|m)at\.? означает строчную букву f, c или m, а затем a, за ней t с последующим дополнительным символом ..

"(f|c|m)at\.?" => The fat cat sat on the mat.

Тестировать выражение

2.8 Анкеры — Привязки

В regexp мы используем привязки, чтобы проверить, является ли соответствующий символ первым или последним символом входной строки. Привязка бывает двух типов: первый — это ^, который проверяет является ли соответствующий символ первым введенным, а второй — знак доллара, который проверяет, является ли соответствующий символ последним символом введенной строки.

2.8.1. Caret

Символ ^ используется в regexp, чтобы проверить, является ли соответствующий символ первым символом в введенной строке. Если мы применяем следующее регулярное выражение ^a (проверяем является ли a первым символом) для введенной строки abc, то оно будет равно a. Но если мы применим регулярное выражение ^b к той же строке, то оно ничего не вернет, потому что во входной строке abc символ «b» не является первым. Давайте посмотрим на другое регулярное выражение ^(T|t)he, которое означает: T или t — это символ начала входной строки, за которым следует строчный символ h, а затем e.

"(T|t)he" => The car is parked in the garage.

Тестировать выражение

"^(T|t)he" => The car is parked in the garage.

Тестировать выражение

2.8.2 Доллар

Знак доллара используется для проверки, является ли символ в выражении последним в введенной строке. Например (at\.)$ означает строчную а, за которой следует t, за которой следует a ., которые должны заканчивать строку.

"(at\.)" => The fat cat. sat. on the mat.

Тестировать выражение

"(at\.)$" => The fat cat. sat. on the mat.
Тестировать выражение

Regexp позволяет использовать сокращения для некоторых наборов символов, что делает работу с ними более комфортной. Таким образом, здесь используются следующие сокращения:

Сокращение Описание
. Любой символ, кроме новой строки
\w Соответствует буквенно-цифровым символам:[a-zA-Z0-9_]
\W Соответствует не буквенно-цифровым символам:[^\w]
\d Соответствует цифрам: [0-9]
\D Соответсвует нецифровым знакам: [^\d]
\s Соответствует знаку пробела: [\t\n\f\r\p{Z}]
\S Соответствует символам без пробела: [^\s]

Lookbehind и lookahead (также называемые lookaround) — это определенные типы non-capturing групп (Они используются для поиска, но сами в него не входят). Lookaheads используются, когда у нас есть условие, что этому шаблону предшествует или следует другой шаблон. Например, мы хотим получить все числа, которым предшествует символ $ из входной строки $4.44 and $10.88. Мы будем использовать регулярное выражение (?<=\$)[0-9\.]*, которое означает: получить все числа, содержащие . и которым предшествует символ $. Ниже приведены lookarounds, что используются в регулярных выражениях:

Символ Описание
?= Положительный Lookahead
?! Отрицательный Lookahead
?<= Положительный Lookbehind
?<! Отрицательный Lookbehind

4.1 Положительный Lookahead

Положительный lookahead означает, что эта часть выражения должна следовать за впереди идущим выражением. Возвращаемое значение содержит текст, который совпадает с первой частью выражения. Чтобы определить позитивный lookahead, используют скобки. Внутри них размещают знак вопроса и знак равенства: (?=...). Само же выражение пишется после =. Например, выражение (T|t)he(?=\sfat) — это T в верхнем или нижнем регистре, за которым следует h и e. В скобках мы определяем позитивный lookahead, который говорит движку регулярного выражения искать The или the, за которыми следует fat.

"(T|t)he(?=\sfat)" => The fat cat sat on the mat.

Тестировать выражение

4.2 Отрицательный Lookahead

Негативный lookahead используется, когда нам нужно получить все совпадения в строке, за которой не следует определенный шаблон. Негативный lookahead определяется так же, как и позитивный, с той лишь разницей, что вместо знака равенства мы используем знак отрицания !. Таким образом, наше выражение приобретает следующий вид: (?!...). Теперь рассмотрим (T|t)he(?!\sfat), что означает: получить все The или the в введенной строке, за которыми не следует слово fat, предшествующее знаку пробела.

"(T|t)he(?!\sfat)" => The fat cat sat on the mat.

Тестировать выражение

4.3 Положительный Lookbehind

Положительный lookbehind используется для получения всех совпадений, которым предшествует определенный шаблон. Положительный lookbehind обозначается так: (?<=...). Например, регулярное выражение (?<=(T|t)he\s)(fat|mat) означает получить все fat или mat из строки ввода, которые идут после слова The или the.

"(? The fat cat sat on the mat.

Тестировать выражение

4.4 Отрицательный Lookbehind

Отрицательный lookbehind используется для получения всех совпадений, которым не предшествует определенный шаблон. Отрицательный lookbehind обозначается выражением (?<!...). Например, регулярное выражение (?<!(T|t)he\s)(cat) означает: получить все cat слова из строки ввода, которые не идут после The или the.

"(? The cat sat on cat.

Тестировать выражение

Флаги также часто называют модификаторами, так как они могут изменять вывод regexp. Флаги, приведенные ниже являются неотъемлемой частью и могут быть использованы в любом порядке или сочетании regexp.

Флаг Описание
i Нечувствительность к регистру: делает выражение нечувствительным к регистру.
g Глобальный поиск: поиск шаблона во всей строке ввода.
m Многострочность: анкер метасимвола работает в каждой строке.

5.1 Нечувствительные к регистру

Модификатор i используется для поиска совпадений, нечувствительных к регистру. Например, выражение /The/gi означает прописную букву T, за которой следуют h и e. И в самом конце выражения стоит i, благодаря которому можно проигнорировать регистр. g применяется для того, чтобы найти шаблон во всей введенной строке.
"The" => The fat cat sat on the mat.
Тестировать выражение

"/The/gi" => The fat cat sat on the mat.

Тестировать выражение

5.2 Глобальный поиск

Модификатор используется для выполнения глобального поиска шаблона(поиск будет продолжен после первого совпадения). Например, регулярное выражение /.(at)/g означает любой символ, кроме новой строки, за которым следует строчный символ a, а затем t. Поскольку мы использовали флаг g в конце регулярного выражения, теперь он найдет все совпадения в вводимой строке, а не только в первой (что является стандартом).

"/.(at)/" => The fat cat sat on the mat.

Тестировать выражение

"/.(at)/g" => The fat cat sat on the mat.

Тестировать выражение

5.3 Многострочный поиск

Модификатор m нужен для выполнения многострочного поиска. Как было сказано раннее, привязки (^, $) используются для проверки, является ли шаблон началом или концом строки. Но если мы хотим, чтобы привязки работали в каждой строке, нужно использовать флаг m. Например, регулярное выражение /at(.)?$/gm означает: строчный символ a, за которым следует t и что угодно, только не новая строка. А благодаря флагу m этот механизм регулярных выражений соответствует шаблону в конце каждой строки строки.

"/.at(.)?$/" => The fat
cat sat
on the mat.

Тестировать выражение

"/.at(.)?$/gm" => The fat
cat sat
on the mat.

Тестировать выражение

По умолчанию регулярные выражения выполняются благодаря «жадным» квантификаторам, им соответсвует максимально длинная строка из всех возможных.

"/(.*at)/" => The fat cat sat on the mat.

Тестировать выражение

Чтобы получить «ленивое» выражение, нужно использовать ?. Так будет получена максимально короткая строка.

"/(.*?at)/" => The fat cat sat on the mat.

Тестировать выражение

Источник

Шпаргалка по регулярным выражениям

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

  Аналог Пример Описание
? {0,1} a? одно или ноль вхождений «а»
+ {1,} a+ одно или более вхождений «а»
* {0,} a* ноль или более вхождений «а»

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

Символ «минус» (-) меред модификатором (за исключением 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»

Позиция внутри строки

  Пример Соответствие Описание
^ ^a aaa aaa начало строки
$ a$ aaa aaa конец строки
\A \Aa aaa aaa
aaa aaa
начало текста
\z a\z aaa aaa
aaa aaa
конец текста
\b a\b
\ba
aaa aaa
aaa aaa
граница слова, утверждение: предыдущий символ словесный, а следующий — нет, либо наоборот
\B \Ba\B aaa aaa отсутствие границы слова
\G \Ga aaa aaa Предыдущий успешный поиск, поиск остановился на 4-й позиции — там, где не нашлось a

Скачать в PDF, PNG.

Якоря

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

^[0-9]+

Здесь символ ^обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру.

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

Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например, \dсоответствует любой цифре от 0 до 9 включительно, \wсоответствует буквам и цифрам, а \W— всем символам, кроме букв и цифр. Шаблон, идентифицирующий буквы, цифры и пробел, выглядит так:

\w\s

POSIX

POSIX — это относительно новое дополнение семейства регулярных выражений. Идея, как и в случае с символьными классами, заключается в использовании сокращений, представляющих некоторую группу символов.

Утверждения

Поначалу практически у всех возникают трудности с пониманием утверждений, однако познакомившись с ними ближе, вы будете использовать их довольно часто. Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”».

[^\s]*q(?!werty)[^\s]*

Приведенный выше код начинается с поиска любых символов, кроме пробела ([^\s]*), за которыми следует q. Затем парсер достигает «смотрящего вперед» утверждения. Это автоматически делает предшествующий элемент (символ, группу или символьный класс) условным — он будет соответствовать шаблону, только если утверждение верно. В нашем случае, утверждение является отрицательным (?!), т. е. оно будет верным, если то, что в нем ищется, не будет найдено.

Итак, парсер проверяет несколько следующих символов по предложенному шаблону (werty). Если они найдены, то утверждение ложно, а значит символ qбудет «проигнорирован», т. е. не будет соответствовать шаблону. Если же wertyне найдено, то утверждение верно, и с qвсе в порядке. Затем продолжается поиск любых символов, кроме пробела ([^\s]*).

Кванторы

Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:

a{10,20}

По умолчанию кванторы — «жадные». Поэтому квантор +, означающий «один или больше раз», будет соответствовать максимально возможному значению. Иногда это вызывает проблемы, и тогда вы можете сказать квантору перестать быть жадным (стать «ленивым»), используя специальный модификатор. Посмотрите на этот код:

".*"

Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой:

<a href="helloworld.htm" title="Привет, Мир">Привет, Мир</a>

Приведенный выше шаблон найдет в этой строке вот такую подстроку:

"helloworld.htm" title="Привет, Мир"

Он оказался слишком жадным, захватив наибольший кусок текста, который смог.

".*?"

Этот шаблон также соответствует любым символам, заключенным в двойные кавычки. Но ленивая версия (обратите внимание на модификатор ?) ищет наименьшее из возможных вхождений, и поэтому найдет каждую подстроку в двойных кавычках по отдельности:

"helloworld.htm" "Привет, Мир"

Экранирование в регулярных выражениях

Регулярные выражения используют некоторые символы для обозначения различных частей шаблона. Однако, возникает проблема, если вам нужно найти один из таких символов в строке, как обычный символ. Точка, к примеру, в регулярном выражении обозначает «любой символ, кроме переноса строки». Если вам нужно найти точку в строке, вы не можете просто использовать «.» в качестве шаблона — это приведет к нахождению практически всего. Итак, вам необходимо сообщить парсеру, что эта точка должна считаться обычной точкой, а не «любым символом». Это делается с помощью знака экранирования.

Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычным символом. Есть несколько символов, требующих такого экранирования в большинстве шаблонов и языков. Вы можете найти их в правом нижнем углу шпаргалки («Мета-символы»).

Шаблон для нахождения точки таков:

\.

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

Спецсимволы экранирования в регулярных выражениях
Выражение Соответствие
\ не соответствует ничему, только экранирует следующий за ним символ. Это нужно, если вы хотите ввести метасимволы !$()*+.?[\]^{|}в качестве их буквальных значений.
\Q не соответствует ничему, только экранирует все символы вплоть до \E
\E не соответствует ничему, только прекращает экранирование, начатое \Q

Подстановка строк

Подстановка строк подробно описана в следующем параграфе «Группы и диапазоны», однако здесь следует упомянуть о существовании «пассивных» групп. Это группы, игнорируемые при подстановке, что очень полезно, если вы хотите использовать в шаблоне условие «или», но не хотите, чтобы эта группа принимала участие в подстановке.

Группы и диапазоны

Группы и диапазоны очень-очень полезны. Вероятно, проще будет начать с диапазонов. Они позволяют указать набор подходящих символов. Например, чтобы проверить, содержит ли строка шестнадцатеричные цифры (от 0 до 9 и от A до F), следует использовать такой диапазон:

[A-Fa-f0-9]

Чтобы проверить обратное, используйте отрицательный диапазон, который в нашем случае подходит под любой символ, кроме цифр от 0 до 9 и букв от A до F:

[^A-Fa-f0-9]

Группы наиболее часто применяются, когда в шаблоне необходимо условие «или»; когда нужно сослаться на часть шаблона из другой его части; а также при подстановке строк.

Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:

(ab|bc)

Если в регулярном выражении необходимо сослаться на какую-то из предшествующих групп, следует использовать \n, где вместо nподставить номер нужной группы. Вам может понадобиться шаблон, соответствующий буквам «aaa» или «bbb», за которыми следует число, а затем те же три буквы. Такой шаблон реализуется с помощью групп:

(aaa|bbb)[0-9]+\1

Первая часть шаблона ищет «aaa» или «bbb», объединяя найденные буквы в группу. За этим следует поиск одной или более цифр ([0-9]+), и наконец \1. Последняя часть шаблона ссылается на первую группу и ищет то же самое. Она ищет совпадение с текстом, уже найденным первой частью шаблона, а не соответствующее ему. Таким образом, «aaa123bbb» не будет удовлетворять вышеприведенному шаблону, так как \1будет искать «aaa» после числа.

Одним из наиболее полезных инструментов в регулярных выражениях является подстановка строк. При замене текста можно сослаться на найденную группу, используя $n. Скажем, вы хотите выделить в тексте все слова «wish» жирным начертанием. Для этого вам следует использовать функцию замены по регулярному выражению, которая может выглядеть так:

replace(pattern, replacement, subject)

Первым параметром будет примерно такой шаблон (возможно вам понадобятся несколько дополнительных символов для этой конкретной функции):

([^A-Za-z0-9])(wish)([^A-Za-z0-9])

Он найдет любые вхождения слова «wish» вместе с предыдущим и следующим символами, если только это не буквы или цифры. Тогда ваша подстановка может быть такой:

$1<b>$2</b>$3

Ею будет заменена вся найденная по шаблону строка. Мы начинаем замену с первого найденного символа (который не буква и не цифра), отмечая его $1. Без этого мы бы просто удалили этот символ из текста. То же касается конца подстановки ($3). В середину мы добавили HTML тег для жирного начертания (разумеется, вместо него вы можете использовать CSS или <strong>), выделив им вторую группу, найденную по шаблону ($2).

Модификаторы шаблонов

Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера. Например, модификатор iзаставляет парсер игнорировать регистры.

Регулярные выражения в Perl обрамляются одним и тем же символом в начале и в конце. Это может быть любой символ (чаще используется «/»), и выглядит все таким образом:

/pattern/

Модификаторы добавляются в конец этой строки, вот так:

/pattern/i

Мета-символы

Наконец, последняя часть таблицы содержит мета-символы. Это символы, имеющие специальное значение в регулярных выражениях. Так что если вы хотите использовать один из них как обычный символ, то его необходимо экранировать. Для проверки наличия скобки в тексте, используется такой шаблон:

\(

Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4. Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child. Скачать в PDF, PNG.

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

Регулярные выражения для валидации распространенных видов данных / Хабр

Для проверки текстовых полей на валидность обычно используют регулярные выражения. Существует несколько наиболе распространенных видов таких даных, как например номер кредитки, дата в определенном формате и т. д. На сайте html5pattern.com собирается коллекция регулярных выражений для таких данных (там это позиционируется, как возможное содержимое html5-атрибута pattern у inpit-элементов, но эти регулярные выражения можно использовать и для привычной валидации с помощью javascript). Актуальные для российской аудитории примеры, вместе с соответствующими регулярными выражениями вы можете посмотреть под катом.

  • Номер кредитки:

    [0-9]{13,16}
  • ICQ:

    ([1-9])+(?:-?\d){4,}
  • Набор из букв и цифр (латиница):

    ^[a-zA-Z0-9]+$
  • Набор из букв и цифр (латиница + кириллица):

    ^[а-яА-ЯёЁa-zA-Z0-9]+$
  • Домен (например abcd.com):

    ^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$
  • IPv4: (подкорректировано runcore)

    ((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
  • IPv6:

    ((^|:)([0-9a-fA-F]{0,4})){1,8}$
  • Имя пользователя (с ограничением 2-20 символов, которыми могут быть буквы и цифры, первый символ обязательно буква):

    ^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$
  • Пароль (Строчные и прописные латинские буквы, цифры):

    ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$
  • Пароль (Строчные и прописные латинские буквы, цифры, спецсимволы. Минимум 8 символов):

    (?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$
  • Дата в формате YYYY-MM-DD:

    [0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])
    UPD. Более строгая проверка, предложенная runcore:

    (19|20)\d\d-((0[1-9]|1[012])-(0[1-9]|[12]\d)|(0[13-9]|1[012])-30|(0[13578]|1[02])-31)
  • Дата в формате DD/MM/YYYY:

    (0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d
  • Целые числа и числа с плавающей точкой (разделитель точка):

    \-?\d+(\.\d{0,})?
  • UUID:

    ^[0-9A-Fa-f]{8}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{12}$
  • Широта или долгота:

    -?\d{1,3}\.\d+

  • UPD. E-mail (от kvf77):

    ^[-\w.][email protected]([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$
  • UPD. URL на латинице. Если нужно распознавать и кириллические домены, необходимо изменить все «a-z0-9» на «а-яёa-z0-9» и добавить в список доменных зон «рф» (от kvf77):

    ~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})[email protected])?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:ru|su|com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,[email protected]%&?+=\~/-]*)?(?:#[^ ‘\»&]*)?$~i
  • UPD. Время в формате HH:MM:SS (от runcore):

    ^([0-1]\d|2[0-3])(:[0-5]\d){2}$
  • UPD. Mac-адрес (от tiahin):

    ([0-9a-fA-F]{2}([:-]|$)){6}$|([0-9a-fA-F]{4}([.]|$)){3}

Неуказанные, но важные на ваш взгляд типы данных, можете выкладывать в комментариях (вместе с регулярными выражениями). Можете так же поделиться ими с html5pattern.com, заполнив форму на главной странице. Начало строки $ Конец строки \ A Начало строки \ z Конец строки

. Любой одиночный символ
\ с Любой пробельный символ
\ S Любой непробельный символ
\ d Любая цифра
\ D Любое нецифровое
\ w Любой символ слова (буква, цифра, знак подчеркивания)
\ Вт Любой символ, не являющийся словом
\ b Любая граница слова
(...) Захватить все замкнутое
(а | б) а или б
а? Ноль или один из
а * Ноль или более
а + Один или несколько из
а {3} Ровно 3 из
а {3,} 3 или более из
а {3,6} Между 3 и 6 из

.

Онлайн-тестер и отладчик регулярных выражений

Классы символов
. любой символ, кроме новой строки
\ ш \ д \ с слово, цифра, пробел
\ W \ D \ S не слово, цифра, пробел
[abc] любой из a, b или c
[^ abc] не a, b или c
[а-г] символ между a и g
Анкеры
^ abc $ начало / конец строки
\ б граница слова
Экранированные символы
\.\ * \\ экранированных специальных символов
\ t \ n \ r табуляция, перевод строки, возврат каретки
\ u00A9 Unicode сброшен ©
Группы и поиск
(abc) группа захвата
\ 1 обратная ссылка на группу № 1
(?: Abc) группа без захвата
(? = Abc) положительный прогноз
(?! Abc) негативный прогноз
Квантификаторы и чередование
а * а + а? 0 или более, 1 или более, 0 или 1
а {5} а {2,} ровно пять, два или больше
а {1,3} между одним и тремя
а +? а {2,}? совпадений как можно меньше
ab | cd соответствует ab или cd

.

Тестер регулярных выражений — Javascript, PCRE, PHP

Классы символов
. любой символ, кроме новой строки
\ ш \ д \ с слово, цифра, пробел
\ W \ D \ S не слово, цифра, пробел
[abc] любой из a, b или c
[^ abc] не a, b или c
[а-г] символ между a и g
Анкеры
^ abc $ начало / конец строки
\ б граница слова
Экранированные символы
\.\ * \\ экранированных специальных символов
\ t \ n \ r табуляция, перевод строки, возврат каретки
\ u00A9 Unicode сброшен ©
Группы и поиск
(abc) группа захвата
\ 1 обратная ссылка на группу № 1
(?: Abc) группа без захвата
(? = Abc) положительный прогноз
(?! Abc) негативный прогноз
Квантификаторы и чередование
а * а + а? 0 или более, 1 или более, 0 или 1
а {5} а {2,} ровно пять, два или больше
а {1,3} между одним и тремя
а +? а {2,}? совпадений как можно меньше
ab | cd соответствует ab или cd

.

Инструмент регулярных выражений — regex.larsolavtorvik.com

Привет.
Пора обновить этот инструмент. Если у вас есть предложения по улучшению, которые вы хотели бы, сообщите мне в моем аккаунте twitter .

Ларс Олав

Шаблон (начальная и конечная косая черта будут добавлены при необходимости)

Замена

Субъект

совпадений

Код

Результат

Помощь PHP PCRE

.
Начало темы (или строки в многострочном режиме)
$
Конец темы (или строка в многострочном режиме)
[
Определение класса начального символа
]
Определение класса конечного символа
|
Заместители (OR)
(
Стартовый подшаблон
)
Конечный подшаблон
\
Эскейп-персонаж
\ n
Новая строка (шестнадцатеричный 0A)
\ r
Возврат каретки (шестнадцатеричный 0D)
\ т
Табуляция (шестигранник 09)
\ d
Десятичная цифра
\ D
Знак, не являющийся десятичной цифрой
\ ч
Горизонтальный пробельный символ
\ H
Символ, не являющийся горизонтальным пробелом
\ с
Пробельный символ
\ S
Символ, не являющийся пробельным символом
\ в
Вертикальный пробельный символ
\ V
Символ, не являющийся вертикальным пробелом
\ w
Символ «Слово»
\ Вт
«Несловесный» символ
\ b
Граница слова
\ B
Не граница слова
\ A
Начало темы (независимо от многострочного режима)
\ Z
Конец темы или новая строка в конце (независимо от многострочного режима)
\ z
Конец темы (независимо от многострочного режима)
\ G
Первая подходящая позиция в теме
н *
Ноль или более n
п +
Один или несколько из n
n?
Ноль или одно вхождение n
{n}
n находок
{n,}
Не менее n вхождений
{, m}
Максимум m находок
{n, m}
Между n и m находками

Помощь PHP POSIX

.
Начало темы (или строки в многострочном режиме)
$
Конец темы (или строка в многострочном режиме)
[
Определение класса начального символа
]
Определение класса конечного символа
|
Заместители (OR)
(
Стартовый подшаблон
)
Конечный подшаблон
\
Эскейп-персонаж
[: alnum:]
Буквенно-цифровой символ
[: alpha:]
Альфа-символ
[: цифра:]
Цифра
[: пусто:]
Пробел и табуляция
[: верх:]
Буква верхнего регистра
[: нижний:]
Буква нижнего регистра
[: space:]
Пробел
[: punct:]
Знак препинания
н *
Ноль или более n
п +
Один или несколько из n
n?
Ноль или одно вхождение n
{n}
n находок
{n,}
Не менее n вхождений
{, m}
Максимум m находок
{n, m}
Между n и m находками

Помогите Javascript

.
Начало темы
$
Конец темы
[
Определение класса начального символа
]
Определение класса конечного символа
|
Заместители (OR)
(
Стартовый подшаблон
)
Конечный подшаблон
\ b
Граница слова
\ B
Неизношенный край
\ n
Новая строка
\ f
Символ подачи формы
\ r
Символ возврата каретки
\ т
Символ горизонтальной табуляции
\ в
Вертикальный символ табуляции
\ w
Символ слова
\ Вт
Несловесный символ
\ d
Цифра
\ D
Нецифровый
\ с
Пробел, эквивалентный [\ t \ r \ n \ v \ f]
\ S
Непробельный символ, эквивалентный [^ \ t \ r \ n \ v \ f]
\
Эскейп-персонаж
н *
Ноль или более n
п +
Один или несколько из n
n?
Ноль или одно вхождение n
{n}
n находок
{n,}
Не менее n вхождений
{, m}
Максимум m находок
{n, m}
Между n и m находками

Помощь Perl

.
Начало темы
$
Конец темы
[
Определение класса начального символа
]
Определение класса конечного символа
|
Заместители (OR)
(
Стартовый подшаблон
)
Конечный подшаблон
\ b
Граница слова
\ B
Неизношенный край
\ n
Новая строка
\ f
Общий перевод строки
\ f
Символ подачи формы
\ r
Символ возврата каретки
\ т
Символ горизонтальной табуляции
\ в
Вертикальный символ табуляции
\ w
Символ слова
\ Вт
Несловесный символ
\ d
Цифра
\ D
Нецифровый
\ с
Пробел, эквивалентный [\ t \ r \ n \ v \ f]
\ S
Непробельный символ, эквивалентный [^ \ t \ r \ n \ v \ f]
\
Эскейп-персонаж
н *
Ноль или более n
п +
Один или несколько из n
n?
Ноль или одно вхождение n
{n}
n находок
{n,}
Не менее n вхождений
{, m}
Максимум m находок
{n, m}
Между n и m находками

Справка Python

.
Начало темы
$
Конец темы
[
Определение класса начального символа
]
Определение класса конечного символа
|
Заместители (OR)
(
Стартовый подшаблон
)
Конечный подшаблон
\ b
Граница слова
\ B
Неизношенный край
\ n
Новая строка
\ f
Общий перевод строки
\ f
Символ подачи формы
\ r
Символ возврата каретки
\ т
Символ горизонтальной табуляции
\ в
Вертикальный символ табуляции
\ w
Символ слова
\ Вт
Несловесный символ
\ d
Цифра
\ D
Нецифровый
\ с
Пробел, эквивалентный [\ t \ r \ n \ v \ f]
\ S
Непробельный символ, эквивалентный [^ \ t \ r \ n \ v \ f]
\
Эскейп-персонаж
н *
Ноль или более n
п +
Один или несколько из n
n?
Ноль или одно вхождение n
{n}
n находок
{n,}
Не менее n вхождений
{, m}
Максимум m находок
{n, m}
Между n и m находками

.