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

В этой статье мы изучим следующие темы и многое другое:

Давай сделаем это! 👇

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

Обычное выражение состоит из трех компонентов:

  1. Сам RegEx, отвечающий за определение шаблона для сопоставления
  2. Ввод данных, который представляет собой данные, которые будут подвергаться действию регулярного выражения
  3. Движок, отвечающий за применение выражения

Например: давайте представим, что нам нужно регулярное выражение для проверки электронной почты. В этом случае у нас будут следующие компоненты:

  1. RegEx будет описывать шаблон действительного адреса электронной почты.
  2. Вводимыми данными будет электронное письмо, сообщенное пользователем для проверки.
  3. Подсистемой будет язык программирования, используемый для применения выражения

Как создать регулярное выражение?

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

/meta-characters/[flags]

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

Наиболее распространенные флаги:

  • i (игнорировать регистр) – различия между прописными и строчными буквами не следует принимать во внимание.
  • g (глобальный источник) — включает глобальный захват данных при вводе данных, а также сохранение индексов вхождений и возможность навигации между ними (т. е. если ваши входные данные совпадают несколько раз, с этим флагом вы получите все результаты, иначе будет возвращено только первое совпадение)
  • m (многострочный) — сообщает, что запись состоит из нескольких строк, что приводит к применению регулярного выражения к каждой из строк.

Что такое мета персонажи?

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

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

Давайте посмотрим на наиболее часто используемые метасимволы:

Начало (^) и конец ($)

^ (начало) — указывает начало строки в регулярном выражении. Синтаксис: /^<....>/

$ (end) — указывает конец строки в регулярном выражении. Синтаксис: /<...>$/

Пример 1:

  • Регулярное выражение: /^[1,9]/g
  • Ввод: 0,1,2,3,4

Здесь соответствий нет, потому что регулярное выражение ищет строку, которая начинается с символа от 1 до 9.

Пример 2:

  • Регулярное выражение: /^[1,9]/g
  • Ввод: 1,2,3,4,5
  • Совпадений: 1

Здесь соответствие есть, так как ввод начинается с цифры 1.

Пример 3:

  • Регулярное выражение: /[1,9]$/g
  • Ввод: 1,2,3,4,5
  • Совпадений: 5

Тоже совпадение, но с использованием конца строки, поэтому оно соответствует числу 5.

Группа символов ([ и ])

[ (начало группы) — указывает начало группы символов. Синтаксис: /[<....>]/

] (конец группы) — указывает конец группы символов. Синтаксис: /[<...>$]/

Пример:

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

  • Регулярное выражение: /[J,j]ohn/g
  • Вход:
john
John
johN
joseph
  • Совпадения: john, John

Точка (.)

. (подстановочный знак) — указывает любой другой символ. Синтаксис: /./

Пример:

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

  • Регулярное выражение: /.and/g
  • Вход:
Sand
Same
Wand
Land
Brand
  • Совпадения: sand, wand, land

Логический оператор И (.*)

.* (И) — выполняет логическую операцию И между двумя выражениями. Синтаксис: /<exp-1>.*<exp-2>/

Пример:

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

  • Регулярное выражение: /[AEIOU].*[aeiou]/g
  • Вход:
Amira
Anna
Laura
Sophie
Olivia
  • Совпадения: Amira, Anna, Olivia

Логический оператор ИЛИ (|)

| (ИЛИ) — выполняет логическую операцию ИЛИ между двумя выражениями. Синтаксис: /<exp-1>|<exp-2>/

Пример:

Представьте, что мы хотим получить все крупные магазины (гипер или мега) из ввода данных.

  • Регулярное выражение: /^(super|mega)store/gm
  • Вход:
superstore
ministore
megastore
  • Совпадения: superstore, megastore

Логический оператор НЕ (^)

^(НЕ) — выполняет логическую операцию НЕ перед выражением. Синтаксис: /[^<exp>]/

Пример:

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

  • Регулярное выражение: /^[^AEIOU].*/gm
  • Вход:
Amanda
Sam
John
Anna
  • Совпадения: Sam, John

Фигурные скобки ({ и })

{} (повторение) — позволяет обнаружить повторение выражения n раз или в пределах диапазона. Синтаксис: /<exp>{min, max}/

Пример:

Давайте напишем выражение, чтобы получить все слова из 7 букв и заканчивающиеся на nd.

  • Регулярное выражение: /^.{7}nd*/gm
  • Вход:
Command
Rebound
Mustard
Executive
Inbound
  • Совпадения: Command, Rebound, Inbound

Знак плюс (+)

+ (1 или более вхождений) — проверяет, встречается ли символ слева хотя бы один раз во входных данных. Синтаксис: /<exp>+/

Пример:

Напишем выражение для получения всех вхождений символа c.

  • Регулярное выражение: /a+/gm
  • Вход:
Music
Book
Technology
Success
  • Совпадения: Music, Technology, Success

Вопросительный знак (?)

? (0 или 1 вхождение) — проверяет, встречается ли символ слева 0 или хотя бы один раз во входных данных. Сделать это необязательным. Синтаксис: /<exp>?/

Пример:

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

  • Регулярное выражение: /^car[s]?$/gm
  • Вход:
car
cars
carz
  • Совпадения: car, cars

Звездочка (*)

* (0 или более вхождений) — проверяет, встречается ли символ слева во входных данных 0 или много раз. Синтаксис: /<exp>*/

Пример:

Представьте, что мы хотим получить слово «привет» с таким количеством y, которое написал человек.

  • Регулярное выражение: /^hey*$/gm
  • Вход:
hey
heyy
heyyy
heyhey
  • Совпадения: hey, heyy, heyyy

Дефис (-)

- (interval) — проверяет совпадения, соответствующие интервалу символов. Синтаксис: /[<start>-<end>]/

Пример:

Представьте, что мы хотим получить все имена от букв от А до М.

  • Регулярное выражение: /^[A-M].*$/gm
  • Вход:
Amanda
Nate
Joe
Clark
  • Совпадения: Amanda, Joe, Clark

Буквенно-цифровые и небуквенно-цифровые (\w и \W)

\w (алфавитно-цифровой) — проверяет наличие буквенно-цифровых символов и подчеркивания. Синтаксис: /\w/

\W (не буквенно-цифровой) — проверяет небуквенно-цифровые символы (например, специальные символы). Синтаксис: /\W/

Пример:

  • Регулярное выражение: /\w/gm
  • Вход:
Test
1234
Test_123
Test$%Test
$%&*&
  • Совпадения: Test, 1234, Test_123, Test$%Test

Цифра и нецифра (\d и \D)

\d (цифры) — проверяет наличие символов, представляющих числа. Синтаксис: /\d/

\D (нецифры) — проверяет наличие нечисловых символов. Синтаксис: /\D/

Пример:

  • Регулярное выражение: /\d/gm
  • Вход:
123
Test
Test_123
  • Совпадения: 123, Test_123

Пространство и не-пространство (\s и \S)

\s (пробел) — проверяет символы, соответствующие пробелам (пробелы, табуляции, разрывы строк и возвраты). Синтаксис: /\s/

\S (нецифры) – проверяет наличие символов, отличных от пробелов. Синтаксис: /\S/

Группы захвата и незахвата (() и (?:))

() (группы захвата) — группирует последовательность символов, которые необходимо захватить. При использовании этого метасимвола создаются подсовпадения. Синтаксис: /(<characters>)/

(?:) (группы без захвата) — группирует последовательность символов, которые не следует захватывать. Синтаксис: /(?:<characters>)/

Как использовать регулярные выражения в Javascript?

В Javascript регулярное выражение — это объект класса RegExp. Мы можем определить его двумя способами:

Буквальная форма:

const myExpression = /test/;

С конструктором RegExp:

const myExpression = new RegExp('test');

Затем мы можем начать использовать наше выражение, допустим, мы хотим найти совпадение в строке:

const newRE = /d(b+)d/g;
const matches = newRE.exec('cdbbdbsbz');

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

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

  • exec() ищет совпадение в строке и возвращает массив результатов
const myExp = RegExp('foo*', 'g');
myExp.exec('table football, foosball');
  • test() — ищет совпадение в строке и возвращает true или false.
const str = 'table football';
const regex = new RegExp('foo*');
regex.test(str); // true
  • match() — поиск совпадений в строке и возврат массива результатов.
const paragraph = 'The quick brown fox was named Mary.';
const regex = /[A-Z]/g;
const found = paragraph.match(regex);
console.log(found); // Array ["T", "M"]
  • search() — ищет совпадение между регулярным выражением и возвращает индекс совпадения.
const paragraph = 'The quick brown fox jumps over the lazy dog. If the dog barked, was it really lazy?';
// any character that is not a word character or whitespace
const regex = /[^\w\s]/g;
console.log(paragraph.search(regex)); // 43
  • replace() — возвращает новую строку с одним, несколькими или всеми совпадениями шаблона, замененными заменой.
const text = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';
const regex = /Dog/i;
console.log(text.replace(regex, 'ferret'));
// "The quick brown fox jumps over the lazy ferret. If the dog reacted, was it really lazy?"

Памятка наиболее часто используемых регулярных выражений

  • электронные письма
^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$
  • Электронная почта (но только Gmail и Hotmail)
^([\w\-\.]+@(?!gmail.com)(?!hotmail.com)([\w\- ]+\.)+[\w-]{2,4})?$
  • URL-адреса
^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$
  • Телефон и мобильные номера
(\(?([\d \-\)\–\+\/\(]+)\)?([ .\-–\/]?)([\d]+))
  • Обрезать строку
^[\s]*(.*?)[\s]*$
  • Айпи адрес
^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
  • Имя пользователя (1–15 символов с буквенно-цифровыми символами)
^(?=.*[a-zA-Z]{1,})(?=.*[\d]{0,})[a-zA-Z0-9]{1,15}$

Заключение

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

Спасибо за прочтение! Следуйте за мной на этой платформе, чтобы узнать больше о разработке. Хорошего дня, скоро увидимся! 👋