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

Зачем, а почему??

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

Из чего состоит регулярное выражение

Любое регулярное выражение состоит из двух частей.

  1. Паттерн - по сути шаблон, шаблон что мы ищем в строке, или что пытаемся удалить и тд.

  2. Флаг - они влияют на поиск, есть 3 классических флага:

    1. i - если мы хотим что то найти вне зависимости регистра.

    2. g - когда пытаемся найти несколько вхождений.

    3. m - включает многострочный режим. Строки могут быть и с переносами, тут флаг m нам и пригодиться.

    4. Так же их можно комбинировать /n/igm - вот так

Создаем регулярное выражение

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

Создание через конструктор

Первый вариант это при помощи конструктора(не используется в 99%)

new RegExp('pattern','flags');

Современный вариант

Второй более короткий вариант:

/pattern/flags;

Использование в переменной

Регулярные выражения мы можем просто добавить в переменную и потом пользоваться.

const newRegExp = /pattern/flags;

Методы строк которые работаю с рег выражениями

Некоторые методы строк которые работают с регулярными выражениями.

Этот метод очень простой и ищет всегда первое совпадение.

const name = 'Дима';
const reg = /д/i; // создадим выражение отдельно в переменной

// используем метод search(тут наше рег выражение)
console.log(name.search(reg));  // 0

// мы ввели Дима и получили в консоль 0 - это индекс по которому мы нашли первый результат. Если искомого элемента не будет получим -1

Для того что бы найти все искомые элементы или все в незовисимости большая или маленькая и тд, для этого используются флаги. Мы использовали флаг i и искали вне зависимости регистра. Попробуем без него:

const name = 'Дима';
const reg = /д/;

console.log(name.search(reg)); // -1

match()

Этот метод вернет массив с кусочком строки который искали, с его индексом, и самой строкой

const name = 'Дима';
const reg = /д/i; 

console.log(name.match(reg)); // [ 'Д', index: 0, input: 'Дима', groups: undefined ]
// у вас может быть свойство groups, а может и не быть, в зависимости от вашего браузера, не обращайте на него внимание. 

replace()

Этим методом мы можем что-то заменить, есть два главных аргумента:

  1. фрагмент - это то, что мы меняем
  2. Это то, на что мы меняем
// с помощью replace и рег выр уберем все дифисы в строке
console.log('12-30-56'.replace(/-/g,'')); // 123056

Использование точки

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

const pass = 'ПАРОЛЬы';
console.log(pass.replace(/./g, "*")); // *******

А что бы поставить саму точку, нужно экранировать ее поставить обратный слеш \ - он указывает что дальше идет не спец символ.

const pass = 'ПАРОЛЬы.'; // поставим точку в конце, для примера
// заменим только точку в конце
console.log(pass.replace(/\./g, "*")); // ПАРОЛЬы*

test()

Это уже метод самого объекта регулярного выражения. Он проверяет есть ли в рег выражение то что мы ищем. То есть если мы ищем маленькие буквы n и в имени оно есть и рег выр срабатывает, то нам вернет true если нет то false

const name = 'Дима';
const reg = /д/i;
console.log(reg.test(name)); // true
// Тут рег выражение без переменной
console.log(/ы/i.test(name)); // false

Классы

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

  • \d - ищем цифры
  • \w - ищем все слова(буквы)
  • \s - ищем все пробелы

Так же есть обратные классы.

  • \D - ищем не числа
  • \W - ищем не буквы
  • \S - Ищем не пробелы

Пример использования классов

const num = '100s';
const regN = /\d/g;
console.log(num.match(regN)); // [ '1', '0', '0' ]
// получили только цифры без буквы s

Мы можем все это комбинировать как душе угодно.

const str = 'This is A1B2 1';

console.log(str.match(/\w\d\w\d/i)); // мы полуим A1B2
// получим все пробелы из текста.
console.log(str.match(/\s/ig)); // [ ' ', ' ', ' ' ]
// хотим получить цифру с пробелом перед ней? легко
console.log(str.match(/\s\d/ig)); // [ ' 1' ]
// тоже самое но с классом S - ищем цифры перед которыми не пробел
console.log(str.match(/\S\d/ig)); // [ 'A1', 'B2' ]

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