В нашем приложении есть темы, которые может создавать пользователь, и каждая тема должна иметь свой собственный хэштег (или иерархию хэштегов). У нас есть такое регулярное выражение для проверки:
const REGEX_HASHTAG = /^(#[w]?((/?)([a-z0-9]+)+)+)(,\s{0,1}#[a-z0-9]?((/?)([a-z0-9]+)+)+)*$/g;
Мне нужно, чтобы пользователь мог создавать хэштеги, которые имеют такую структуру:
А также пользователи могут поставить запятую (и необязательный пробел) после нового хэштега или иерархии хэштегов. Когда я ставлю слишком много букв и косую черту в конце, Regex перестает работать, выполняется слишком долго. Что я делаю не так?
regexr.com/6hpqo
Существует довольно много вложенных квантификаторов и необязательных частей, которые могут привести к катастрофическим возвратам при отсутствии соответствия.
Вы можете написать шаблон как
^#[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]+)*
Та же выкройка, что и в первой части)*
Закройте группу без захвата и, при желании, повторите ее.$
Конец строки