Проблема заключается в следующем:
(?:'[\w\s]+'|\w+|"[\w\s]+")+
Многие движки регулярных выражений будут пытаться найти множество возможных совпадений для \w+
в общем +
, если сопоставление не удастся. Замена \w+
на \w
должна улучшить производительность.
Кроме того, ваше регулярное выражение имеет такую структуру:
^(TERM (AND|OR) )+TERM$|^TERM$|^$
, которую можно упростить до
^(TERM (AND|OR) )*TERM$|^$
Возможно, было бы полезно создать это явно (выбор доброго имени на ваше усмотрение):
const FOO = /(?:\w|'[\w\s]+'|"[\w\s]+")/.source;
const COMPARE = /(?:=|>|<|>=|<=|!=)/.source;
const BAR = String.raw`(?:${FOO}+\s*${COMPARE}\s*${FOO}+)`;
const BAZ = String.raw`^(?:${BAR}\s+(?:AND|OR)\s+)*${BAR}\s*$|^\s*$`;