Для чего нужны регулярные выражения и как они используются?
Что проверяют
Умеете ли вы пользоваться регулярными выражениями в JavaScript на практике и знаете ли их ловушки. Следом часто просят написать выражение прямо на собеседовании или спрашивают, почему test с флагом g возвращает то true, то false.
Как отвечать
Регулярное выражение это шаблон для поиска, проверки и замены текста. Во фронтенде это валидация полей, разбор строк, подсветка совпадений в поиске, замена в шаблонах. Дальше покажите инструменты JS:
- создание: литерал
/\d+/gилиnew RegExp(str, 'g'). Второй вариант нужен для динамических шаблонов, и пользовательский ввод в нём обязательно экранируют; - методы:
re.test(str)для проверки,str.matchиstr.matchAllдля извлечения,str.replaceиstr.replaceAllдля замены,str.split.matchAllиreplaceAllс регуляркой требуют флагg, иначе будетTypeError; - флаги:
gдля глобального поиска,iбез учёта регистра,mдля многострочных^и$,sчтобы точка совпадала с переводом строки,uи более новыйvдля корректной работы с Unicode и эмодзи,yдля поиска строго с позицииlastIndex,dдля индексов групп; - группы: именованные
(?<year>\d{4})доступны черезmatch.groups.year, есть lookahead и lookbehind.
Для полей формы есть атрибут pattern у input: он проверяет значение целиком, неявно добавляя якоря в начало и конец.
Хорошо показать и чувство меры. Email по RFC регуляркой полноценно не проверить, на клиенте хватает простой проверки или type="email", а настоящую проверку делает письмо с подтверждением. URL надёжнее разобрать конструктором URL, а для простых случаев есть includes и startsWith.
Где спотыкаются
Переиспользуют регулярку с флагом g в test. Она хранит состояние в lastIndex, и повторный вызов на той же строке начинает поиск с середины.
Пишут шаблоны с вложенными квантификаторами вроде (a+)+$. На неподходящей строке это катастрофический бэктрекинг, вкладка зависает, а на сервере в Node.js это уже уязвимость ReDoS.
Собирают new RegExp из пользовательской строки без экранирования. Точка, скобка или + в поисковом запросе ломают шаблон или меняют его смысл.