Шаблон регулярных выражений вызывает катастрофическое отслеживание в крайних случаях

#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*? для сопоставления любых символов, отличных от пробелов (как можно меньше).

Экранируйте символы периода, поскольку они являются метасимволами регулярных выражений.

Используйте [^...] классы отрицаемых символов, если вы знаете, что между двумя подстроками в совпадении не может быть таких символов.