Шаблон ([a-zA-Z0-9\-\_]*)*[sS]uper([a-zA-Z0-9\-\_]*)*
, который вы используете, очень неэффективен и чреват катастрофическим возвратом .Когда вы помещаете образец неограниченной длины (например, a+
или a*
) внутри группы и устанавливаете для него неограниченный квантификатор (например, (a+)+
) и , шаблон не находится в концеregex, катастрофическое возвращение неизбежно со строками, которые соответствуют шаблону частично, но не полностью.
См. демонстрацию вашего шаблона , работающую с короткой строкой, такой как Super
.Посмотрите, как трудно для движка регулярных выражений убедиться, что Super
является правильным соответствием для шаблона, с красными стрелками, указывающими на возврат:

Теперь проверьте, насколько быстрым становится шаблон, если развернуть вложенные количественные шаблоны и использовать [a-zA-Z0-9_-]*[sS]uper[a-zA-Z0-9_-]*
, см. эту демонстрацию , с количеством шагов, уменьшенным с 167 до 13. Обратите внимание, что вы этого не делаетевам нужно экранировать _
char (это word char), и вам не нужно экранировать -
внутри класса символов, если он находится в начале / конце класса.
Если вы используете .caseInsensitive
параметр (например, options: [ .caseInsensitive ]
), вы можете даже сократить шаблон до [a-z0-9_-]*super[a-z0-9_-]*
.