Регулярное выражение для дерева хэштегов выполняется слишком долго

В нашем приложении есть темы, которые может создавать пользователь, и каждая тема должна иметь свой собственный хэштег (или иерархию хэштегов). У нас есть такое регулярное выражение для проверки:

const REGEX_HASHTAG = /^(#[w]?((/?)([a-z0-9]+)+)+)(,\s{0,1}#[a-z0-9]?((/?)([a-z0-9]+)+)+)*$/g;

Мне нужно, чтобы пользователь мог создавать хэштеги, которые имеют такую ​​структуру:

  1. (#) условное обозначение
  2. Текст в нижнем регистре
  3. Необязательный слэш (/), за которым следует текст в нижнем регистре для создания иерархии

А также пользователи могут поставить запятую (и необязательный пробел) после нового хэштега или иерархии хэштегов. Когда я ставлю слишком много букв и косую черту в конце, Regex перестает работать, выполняется слишком долго. Что я делаю не так?

regexr.com/6hpqo

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
17
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Вы можете написать шаблон как

^#[a-z0-9]+(?:/[a-z0-9]+)*(?:,\s*#[a-z0-9]+(?:/[a-z0-9]+)*)*$
  • ^ Начало строки
  • #[a-z0-9]+ Совпадение # и 1+ повторений перечисленных символов в классе персонажей
  • (?:/[a-z0-9]+)* При желании повторите / и тот же класс символов
  • (?: Группа без захвата
    • ,\s* Сопоставьте запятую и необязательные пробельные символы
    • #[a-z0-9]+(?:/[a-z0-9]+)* Та же выкройка, что и в первой части
  • )* Закройте группу без захвата и, при желании, повторите ее.
  • $ Конец строки

Демонстрация регулярных выражений

Другие вопросы по теме