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

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

const removeCommas = function(string) {
  let cleanString = '';
    for(let i = 0; i <= string.length; i++) {
      if (string[i] !== ',') {
        cleanString += string[i];
      }
    }
  return cleanString;
}

Все это для того, чтобы убрать запятые !? Давайте попробуем немного сахара ES6 и посмотрим, немного ли это проясняет ситуацию.

const removeCommas = (string) => {
  return string.split('').map((letter) => {
    if (letter !== ',') {
      return letter
    }
  }).join('')
}

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

const removeCommas = function(string) {
  return string.replace(/,/g,'');
}

Ваааааааааааааааааааааааааалаала роль Дядя Билл, старый негодяй! Это было так просто. Но что это за символы внутри моего метода замены? Что мои друзья - это регулярное выражение или, для краткости, регулярное выражение. Это язык, созданный в 1950-х годах и описанный как набор символов, используемых для создания шаблона поиска текста. С тех пор он был реализован во многих местах, включая текстовые процессоры, поисковые системы и, надеюсь, скоро ваш собственный личный код!

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

Example from above: /,/g   
Syntax: /pattern/modifiers;

В JavaScript регулярные выражения всегда начинаются с одного /, за которым следует шаблон, который вы ищете. Паттерн может быть выражен несколькими различными способами, о которых мы скоро поговорим. Затем еще один / используется для завершения вашего шаблона. После этого вы помещаете что-то, называемое флагом или модификатором. В приведенном выше примере мы используем «g» или global. Это позволяет нашему регулярному выражению продолжать поиск после того, как будет найден первый шаблон. По умолчанию флаг отсутствует. В этом случае мы прекратим поиск строки после нахождения первого совпадающего шаблона. В приведенных выше примерах это означало бы замену только первой попавшейся запятой.

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

Example: /Bill|4/g
Syntax: /patternA|PatternB/modifiers;

Для поиска нескольких шаблонов мы просто помещаем конвейер между каждым конкретным шаблоном, который мы ищем. В приведенном выше примере мы ищем имя «Билл» и число 4.

Что, если мне нужно будет найти много чего, скажи все буквы алфавита! Было бы больно все это печатать.

Example: /[a-z]/g
Syntax: /[startRange-endRange]/modifiers;

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

Example: /[1-3]/g

Как насчет ситуации, когда я хочу сделать наоборот?

Example: /[^a]/g

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

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

Example: /^.{8,12}$/g
Syntax: /StartOfString AnySingleChar{Mininum,Maximum}EndOfString

Обратите внимание, что в начальном примере я не использовал точки. Это потому, что одиночная точка на самом деле представляет «любой отдельный символ». Таким образом, одна точка найдет все отдельные пробелы и все (в регулярном выражении есть много специальных символов, таких как \ s, которые представляют пробелы). Фигурные скобки обозначают ряд предметов. Таким образом, приведенное выше Regex просто определяет, есть ли во всей строке от 8 до 12 элементов. Аналогичным образом в следующем примере выполняется поиск, есть ли хотя бы три символа подряд во всей строке.

Example: /^a{3,}$/g

Но как насчет карата и шика! Эти два символа представляют собой начало и конец строки соответственно. Вместе они создают шаблон поиска, который будет удовлетворен только в том случае, если вся строка будет содержать именно то, что указано в них. Таким образом, приведенный выше код найдет «aaa», но не найдет «aaaaaaa».

Хорошо, еще один пример, который вам нужно выяснить самостоятельно ...

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{10,12}/g

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

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

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

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