Изучаем регулярные выражения: руководство для начинающих

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

Регулярные выражения имеют множество вариантов использования, в том числе:

проверка ввода формы

веб-скрапинг

поиск и замена

фильтрация информации в больших текстовых файлах, таких как журналы

Регулярные выражения выглядят для новых пользователей сложными и пугающими. Взгляните на этот пример:

/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/

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

Изучаем регулярные выражения: руководство для начинающих

Я покажу вам, как быстро освоить регулярные выражения. Во-первых, давайте проясним терминологию, используемую в этом руководстве:

шаблон: шаблон регулярного выражения

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

цифра: 0-9

буква: az, AZ

символ: ! $% ^ & * () _ + | ~ — = `{} []:”; ‘<>?,. /

пробел: одиночный пробел, табуляция

символ: относится к букве, цифре или символу

Основы

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

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

Далее, вам необходимо отключить в Regex101 флаги global и multi line. Мы рассмотрим их в следующем разделе. А пока мы сосредоточимся на простейшей форме регулярного выражения, которую мы можем создать. Введите следующее:

поле ввода регулярного выражения: cat

тестовая строка: rat bat cat sat fat cats eat tat cat mat CAT

Изучаем регулярные выражения: руководство для начинающих

Обратите внимание, что регулярные выражения в JavaScript начинаются и заканчиваются на /. Если бы вы написали регулярное выражение в коде JavaScript, оно выглядело бы как /cat/ без кавычек. В приведенном выше примере регулярное выражение соответствует строке «cat». Однако, как вы можете видеть на изображении выше, есть несколько «кошачьих» строк, которые не совпадают. В следующем разделе мы рассмотрим, почему.

Флаги регулярных выражений глобально и без учёта регистра

По умолчанию шаблон регулярного выражения возвращает только первое найденное совпадение. Если вы хотите вернуть дополнительные совпадения, вам необходимо включить флаг глобально, обозначаемый как g. Шаблоны регулярных выражений по умолчанию также чувствительны к регистру. Вы можете изменить это поведение, включив флаг без учета регистра, обозначается, как i. Обновленный шаблон регулярного выражения теперь полностью выражается, как /cat/gi. Как вы можете видеть ниже, все «кошачьи» строки были сопоставлены, включая строку в другом регистре.

Изучаем регулярные выражения: руководство для начинающих

Наборы символов

В предыдущем примере мы узнали, как искать точные совпадения с учетом регистра. Что, если бы мы хотели сопоставить «bat», «cat» и «fat». Мы можем сделать это, используя наборы символов, обозначенные []. По сути, вы вводите несколько символов, которые хотите сопоставить. Например, [bcf]at будет соответствовать нескольким строкам следующим образом:

Изучаем регулярные выражения: руководство для начинающих

Наборы символов также работают с цифрами.

Диапазоны

Предположим, мы хотим сопоставить все слова, которые заканчиваются на at. Мы могли бы предоставить внутри набора символов полный алфавит, но это было бы утомительно. Решение — использовать такие диапазоны [a-z]at:

Изучаем регулярные выражения: руководство для начинающих

Вот полная строка, которая проверяется: rat bat cat sat fat cats eat tat cat dog mat CAT.

Как видите, все слова совпадают, как и ожидалось. Я добавил слово dog, чтобы указать недопустимое совпадение. Вот другие способы использования диапазонов:

Частичный диапазон: варианты выбора, такие как [a-f] или [g-p].

Заглавный диапазон: [A-Z].

Диапазон цифр: [0-9].

Диапазон символов: например, [#$%&@].

Смешанный диапазон: например, [a-zA-Z0-9] включает все цифры, строчные и прописные буквы. Обратите внимание, что диапазон определяет только несколько альтернатив для одного символа в шаблоне.

Чтобы лучше понять, как определять диапазон, посмотрите на полную таблицу ASCII, чтобы увидеть, как упорядочены символы.

Изучаем регулярные выражения: руководство для начинающих

Повторяющиеся символы

Допустим, вы хотите сопоставить все трехбуквенные слова. Вы, наверное, сделали бы это так:

[a-z][a-z][a-z]

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

a{5} будет соответствовать «ааааа».

n{3} будет соответствовать «nnn».

[a-z]{4} будет соответствовать любому слову из четырех букв, например, «door», «room» или «book».

[a-z]{6,} будет соответствовать любому слову из шести или более букв.

[a-z]{8,11} будет соответствовать любому слову от 8 до 11 букв. Таким образом можно выполнить базовую проверку пароля.

[0-9]{11} будет соответствовать 11-значному числу. Таким образом можно выполнить базовую проверку телефона.

Метасимволы

Метасимволы позволяют писать еще более компактные шаблоны регулярных выражений. Давайте рассмотрим:

\d соответствует любой цифре, совпадающей с [0-9]

\w соответствует любой букве, цифре и символу подчеркивания

\s соответствует пробельному символу, то есть пробелу или табуляции

\t соответствует только символу табуляции

С помощью того, что мы узнали, мы можем писать такие регулярные выражения:

\w{5} соответствует любому пятибуквенному слову или пятизначному числу

\d{11} соответствует 11-значному номеру, например, номеру телефона

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

Специальные символы продвигают нас на шаг вперед в написании более сложных выражений:

+: Один или несколько квантификаторов (предшествующий символ должен существовать и может быть при необходимости продублирован). Например, выражение c+at будет соответствовать «cat», «ccat» и «ccccccccat». Вы можете повторять предыдущий символ столько раз, сколько хотите, и вы все равно получите совпадение.

?: Ноль или один квантификатор (предшествующий символ не является обязательным). Например, выражение c?at будет соответствовать только «cat» or «at».

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

\: этот символ используется, когда мы хотим буквально использовать специальный символ. Например, c\* будет точно соответствовать «c *», а не «ccccccc».

[^]: эта «отрицательная» нотация используется для обозначения символа, который не должен совпадать в пределах диапазона. Например, выражение b[^a-c]ld не будет соответствовать «bald» or «bbld», потому что вторые буквы от a до c исключаются. Однако шаблон будет соответствовать «beld», «bild», «bold» и т. д.

.: эта нотация будет соответствовать любой цифре, букве или символу, кроме символа новой строки. Например, .{8}будет соответствовать восьмизначному паролю, состоящему из букв, цифр и символов. Например, «password» and «P@ssw0rd».

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

.+ соответствует одному или неограниченному количеству символов. Например, «c», «cc» и «bcd # .670».

[a-z]+ будет соответствовать всем словам с строчными буквами независимо от длины, если они содержат хотя бы одну букву. Например, «book» и «boardroom».

Группы

Все специальные символы, которые мы только что упомянули, влияют только на один символ или набор диапазонов. Что, если бы мы хотели применить эффект к части выражения? Мы можем сделать это, создав группы, используя круглые скобки — (). Например, шаблон book(.com)? будет соответствовать как «book», так и «book.com», поскольку мы сделали часть «.com» необязательной.

Вот более сложный пример, который можно использовать в реалистичном сценарии, таком как проверка электронной почты:

шаблон: @\w+\.\w{2,3}(\.\w{2,3})?

тестовая строка: abc.com abc@mail @mail.com @mail.co.ke

Изучаем регулярные выражения: руководство для начинающих

Альтернативные символы

В регулярном выражении мы можем указать альтернативные символы с помощью символа «вертикальная черта» — |. Он отличается от специальных символов, которые мы показали ранее, поскольку влияет на все символы с каждой стороны символа вертикальной черты. Например, шаблон sat|sit будет соответствовать как строке «sat», так и «sit». Мы можем переписать шаблон s(a|i)t, чтобы он соответствовал тем же строкам.

Вышеупомянутый шаблон может быть выражен, как s(a|i)t с помощью круглых скобок ().

Начальные и конечные шаблоны

Вы могли заметить, что некоторые положительные совпадения являются результатом частичного совпадения. Например, если я написал шаблон, соответствующий строке «boo», строка «book» также получит положительное совпадение, несмотря на то, что не является точным совпадением. Чтобы исправить это, мы будем использовать следующие обозначения:

^: помещенный в начало, этот символ соответствует шаблону в начале строки.

$: помещенный в конец, этот символ соответствует шаблону в конце строки.

Чтобы исправить описанную выше ситуацию, мы можем записать наш шаблон, как boo$. Это гарантирует, что последние три символа соответствуют шаблону. Однако есть одна проблема, которую мы еще не рассмотрели, как показано на следующем изображении:

Изучаем регулярные выражения: руководство для начинающих

Строка «sboo» находит соответствие, потому что она по-прежнему удовлетворяет текущим требованиям сопоставления с образцом. Чтобы исправить это, мы можем изменить шаблон следующим образом: ^boo$. Это будет строго соответствовать слову «boo». Если вы используете их оба, применяются оба правила. Например, ^[a-z]{5}$ строго соответствует пятибуквенному слову. Если в строке больше пяти букв, шаблон не совпадает.

Регулярное выражение в JavaScript

// Example 1
const regex1=/a-z/ig //Example 2
const regex2= new RegExp(/[a-z]/, 'ig')

Если на компьютере установлен Node.js, откройте терминал и выполните команду node для запуска интерпретатора оболочки Node.js. Далее выполните следующее:

Изучаем регулярные выражения: руководство для начинающих

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

Реальный пример: проверка адреса электронной почты

В заключение этого руководства давайте рассмотрим популярное использование регулярных выражений — проверку электронной почты. (Например, мы можем захотеть проверить, что адрес электронной почты, введенный пользователем в форму, является действительным.)

Этот предмет сложнее, чем вы думаете. Синтаксис адреса электронной почты довольно прост: {name}@{domain}. Теоретически адрес электронной почты может содержать ограниченное количество символов, таких как #-@&%. и т. д. Однако расположение этих символов имеет значение. Почтовые серверы также имеют разные правила использования символов. Например, некоторые серверы считают + недействительным символ. На других почтовых серверах этот символ используется для подадресации электронной почты.

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

# invalid email
abc
abc.com # valid email address
abc@mail.com
abc@mail.nz
abc@mail.co.nz
abc123@mail.com
abc.def@music.com # invalid email prefix
abc-@mail.com
abc..def@mail.com
.abc@mail.com
abc#def@mail.com # valid email prefix
abc-d@mail.com
abc.def@mail.com
abc@mail.com
abc_def@mail.com # invalid domain suffix
abc.def@mail.c
abc.def@mail#archive.com
abc.def@mail
abc.def@mail..com # valid domain suffix
abc.def@mail.cc
abc.def@mail-archive.com
abc.def@mail.org
abc.def@mail.com
fully-qualified-domain@example.com

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

Возможное решение 1:

^\w*(\-\w)?(\.\w*)?@\w*(-\w*)?\.\w{2,3}(\.\w{2,3})?$

Возможное решение 2:

^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$

Заключение

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

Автор: Michael Wanyoike

Источник: https://www.sitepoint.com

Редакция: Команда webformyself.