#javascript #regex
#JavaScript #Регулярное выражение
Вопрос:
У меня есть эти два простых шаблона регулярных выражений для сопоставления URL-адресов из этих хранилищ, но они приводят к катастрофическому возврату и зависанию браузера при запуске по некоторому строковому URL-адресу с пограничным регистром. Эта логика выполняется на тысячах случайных запросов, поэтому вероятность катастрофического возврата высока. У кого-нибудь есть представление о том, что может быть не так в том, как я написал это регулярное выражение.
> ".*://.*.newegg.com/Product/Product.*"
> ".*://.*.gamestop.com*.*Product-Variation*.*productDetailsRedesign"
Комментарии:
1.
.*
Соответствует 0 или более раз любому символу и сначала будет совпадать до конца строки. Затем он может вернуться назад, исследуя все варианты, чтобы увидеть, может ли он соответствовать остальной части шаблона. Использование другого.*
добавит больше возможностей для изучения. Если совпадения нет (крайний случай), он все равно попробует все варианты. Обязательно обратите внимание, предназначено ли это, но обратите внимание, чтоm*
иn*
может совпадать 0 или более раз вm
илиn
Ответ №1:
У вас слишком много шаблонов жадных точек в выражениях. Попробуйте быть немного более подробным:
w ://[^/]*.newegg.com/Product/ProductS*
Второй шаблон:
w ://[^s/]*.gamestop.comS*?Product-VariationS*?productDetailsRedesign
См. доказательство #1 | доказательство # 2.
Используйте S*?
для сопоставления любых символов, отличных от пробелов (как можно меньше).
Экранируйте символы периода, поскольку они являются метасимволами регулярных выражений.
Используйте [^...]
классы отрицаемых символов, если вы знаете, что между двумя подстроками в совпадении не может быть таких символов.