Вы много знаете о том, как работают эти парни? Ты сделаешь!? Затем нажмите эту кнопку несколько раз и переходите к другой статье. Для всех остальных давайте вместе изучим этих полезных парней. После этой статьи мы сможем анализировать простые строки в 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, эта песочница помогла мне очень быстро преодолеть многие проблемы.
Спасибо, что учились вместе со мной! У меня нет изображения милого кота в качестве награды за то, что я зашел так далеко, но я подумал, что это было довольно забавно.