Firefox выдает слишком сложную ошибку при компиляции длинных слов против регулярного выражения - PullRequest
3 голосов
/ 30 августа 2011

У меня есть регулярное выражение, как показано ниже:

var str="checkedchec  ";
var patt=/.*(?:\w+|\S)*\s+(or|and|not|xnot|near|near\d+|onear|onear\d+|title\:|ingress\:|\?|\*|\^|sourceid\:|author\\:|url\:|country\:)\s+.*/i;

var newStr = str.split(patt);

var result=patt.test(str);

Приведенное выше регулярное выражение работает в основном хорошо, но когда у меня есть персонаж длиннее 11 символов, он дает «слишком сложное выражение», за исключением Mozilla Firefox. Отлично работает на IE и Chrome.

Ответы [ 2 ]

6 голосов
/ 30 августа 2011

Ваше регулярное выражение сталкивается с катастрофическим возвратом .В нем есть чередующиеся части, которые могут совпадать с одним и тем же (например, каждый символ, соответствующий \w, может также соответствовать \S и предшествующим .*), поэтому движку регулярных выражений приходится пробовать кучу перестановок.до объявления провала.Например, RegexBuddy прерывает попытку сопоставления после 1 миллиона шагов механизма регулярных выражений, и Firefox, очевидно, делает то же самое (разумное).

Что именно вы пытаетесь сделать?

Изменение регулярного выражения на

/.*\s+(or|and|not|xnot|near|near\d+|onear|onear\d+|title:|ingress:|\?|\*|\^|sourceid:|author:|url:|country:)\s+.*/i

значительно ускоряет матч (теперь всего 408 шагов, пока движок регулярных выражений не сможетобъявить неудачу).

0 голосов
/ 30 августа 2011

Кажется, что ваше регулярное выражение может совпадать несколькими способами.

Это работает, если вы измените \w+ на \w.За ним следует *, так почему вы ставите + здесь?

/.*(?:\w|\S)*\s+(or|and|not|xnot|near|near\d+|onear|onear\d+|title\:|ingress\:|\?|\*|\^|sourceid\:|author\\:|url\:|country\:)\s+.*/i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...