Заключительным видео на этой неделе будут «Регулярные выражения». В JavaScript они имеют так называемый PCRE-совместимый синтаксис. Эта аббревиатура расшифровывается как Perl Compatible Regular Expressions, и о том, что она означает, вы можете прочитать подробнее, перейдя по ссылке, прикрепленной к видео. Также я настоятельно рекомендую вам прочитать описание того, что такое регулярные выражения, какие правила их написания существуют и какие возможности они предоставляют, перейдя по второй ссылке. В JavaScript существуют две функции для работы с регулярными выражениями: это функция test для проверки соответствия строки какому бы то ни было паттерну на основе регулярного выражения и функция replace для замены подстроки в строке на основе какого-то паттерна. Начнем с функции test. У нас есть твит, текст которого может содержать, а может не содержать, хэштеги. Давайте напишем регулярное выражение, которое будет проверять, есть ли внутри нашего твита хэштеги. Регулярные выражения пишутся в двух косых чертах, и между ними пишется паттерн нашего регулярного выражения. Он будет начинаться с символа решетки, так как все хэштеги начинаются с символа решетки. Далее идет классификатор от a до z и от 0 до 9, который определяет, какие символы могут содержаться в хэштегах. Как вы видите, сейчас мы выделили только один символ, потому что мы не указали, какое их количество надо выбирать. Добавив символ «+» к регулярному выражению, тем самым мы говорим, что регулярное выражение будет действовать в строке пока его результат не будет обратным, то есть пока мы находим символы от 0 до 9 и a до z, мы будем выделять символы внутри строки и проверять их соответствие. У регулярных выражений существуют специальные флаги, которые могут менять их поведение. Первый флаг, который нам понадобится, это флаг g, который делает так называемое глобальное сопоставление. С помощью него вы можете проверять, что регулярное выражение находится в строке не один, а несколько раз, ведь хэштегов может быть несколько. А флаг i делает нашу проверку регистронезависимой, он тоже полезен, так как хэштеги могут быть написаны в любом регистре. Проверка этой строки вернет нам true, так как в строке содержится несколько хэштегов в правильном регистре и состоящих из правильных символов. Возьмет другую строку, у которой нет хэштегов. Применив к ней ту же самую функцию с тем же самым регулярным выражением, мы получим false. Теперь займемся обработкой строки на основе регулярных выражений. У нас будет объект твита, у которого будет поле text с текстом твита с хэштегами на русском и английском языках. Создадим у него динамическое свойство linkify. Это будет геттер, и он будет вызываться при обращению к этому полю на чтение. Внутри него будет функция replace, которая заменяет внутри строки подстроку на основе одного регулярного выражения и может вставить другую строку, содержащую данные из регулярного выражения, что нам будет полезно для того, чтобы обрамить хэштеги в ссылке, так как мы хотим подставить внутрь этих ссылок текст из наших хэштегов. Проверим, что наше свойство существует и правильно задекларировано, и обратимся к нему на чтение. Мы увидим, что оно применилось к первому хэштегу, ко второму хэштегу, но не применилось к хэштегу с русскими символами. Почему так произошло? Потому что мы не указали их в правиле нашего регулярного выражения. Давайте добавим туда, кроме a—z и 0—9, символы а—я. Таким образом мы расширим язык нашего регулярного выражения, и оно применится к русскому хэштегу тоже. Но, как вы видите, сейчас мы заменили наш текст хэштегов на ссылке, но внутрь ссылок не подставилось никаких значений. Давайте разбирать дальше. Для того чтобы извлечь с помощью регулярного выражения данные, а именно это нам нужно для того, чтобы вставить внутрь переменных $1 какие-то значения при замене реплейсом, нам необходимо обрамить наше регулярное выражение в круглые скобки. Тем самым мы будем вынимать найденные данные из строки. И, как мы видим, после этого наши переменные заработали, и переменная $1 заменилась на текст из регулярного выражения. Теперь немного усложним наше регулярное выражение. Давайте оставлять внутри текста ссылки хэштег без изменения, то есть с символом решетки, а внутри самого атрибута href вставлять фактически текст хэштега без символа решетки, так как символ решетки внутри ссылки будет перенаправлять нас на якорь внутри страницы, а это не то поведение, которого мы ожидаем. Для этого добавим еще раз круглые скобки в наше регулярное выражение, но на этот раз обрамим ими все, кроме символа решетки. Таким образом, у нас появятся уже две переменные, $1 и $2, которыми мы сможем оперировать для замены. $1 будет содержать все значение вместе с символом решетки, а $2 — только значение внутри вторых круглых скобок без символа решетки. Таким образом, внутрь атрибута href мы подставим правильную корректную ссылку, а внутрь текста подставим правильный, полностью записанный хэштег со всеми необходимыми символами. Также в регулярных выражениях в JavaScript существуют так называемые сочетания, шорткаты, которые позволяют вам писать регулярные выражения чуть проще. Например, есть шорткат \w, который говорит о том, что это регулярное выражение будет применяться ко всем буквам и цифрам. И, по идее, это как раз то, что нам нужно. Но применив это регулярное выражение, мы увидим, что хэштег на русском языке снова перестал работать. На английском языке все хорошо, замены необходимые произошли, а вот с русским хэштегом опять беда. Произошло это потому, что создатели JavaScript считают, что буквы и символы используются только для латинского алфавита, а все остальные не используются, то есть этот паттерн появляется таким: A—Z, a—z, 0—9 и зачем-то символ подчеркивания, который, по сути, не является ни буквой, ни цифрой. Но при этом они не учитывают ни русские буквы, ни буквы из других локалий. Судя по всему, буквами они считают только английские. На этом мы заканчиваем рассматривать регулярные выражения и заканчиваем неделю.