MatchCollection.Count никогда не заканчивается - PullRequest
0 голосов
/ 29 ноября 2018

Я столкнулся с проблемой в MatchCollection, созданной регулярным выражением.Когда я использую .Count в этой коллекции MatchCollection, обработка никогда не заканчивается, как если бы она была завершена в бесконечном цикле.

Технически MatchCollection не может рассчитать, сколько элементов содержится в списке, тогда, если я использую этот список в foreach,это застряло.

Код таков:

var matches = Regex.Matches(OriginalSource, "(function)(.*?){(?:[^{}]+|{(?<n>)|}(?<-n>))+(?(n)(?!))*}", RegexOptions.IgnoreCase);
var ssc = 0;

try {
ssc = matches.Count;
} catch (Exception ex) {
throw new Exception("LOL");
}

foreach (Match match in matches) {
// ...
}

Строка OriginalSource такова: https://pastebin.com/UcL710g7?fbclid=IwAR1HNXZpkxo76Ecxdib9XgaBu0Rz2YmJsRoKFOmrPvLYjQkyY3nKl8RSbgI

Как с этим справиться?Это не исключение, возможно создать процесс тайм-аута?Потому что я могу игнорировать этот код, но этот Список не позволяет мне двигаться вперед.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

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

Я попытался изменить регулярное выражение для использования non greedy quantifiers, теперь оно занимает less than a second.

Вот регулярное выражение:

@"(function)(.*?){(?:[^{}]+|{(?<n>)|}(?<-n>))+?(?(n)(?!))*?}"

Это точно так же, как ваш, но он используетне жадные квантификаторы.

Вы можете проверить регулярное выражение C # здесь: http://bak -o-soft.dk / RegEx / RegExBuilder.aspx

0 голосов
/ 29 ноября 2018

Возможно ли создать процесс Time out?

var matches = Regex.Matches(OriginalSource,
     "(function)(.*?){(?:[^{}]+|{(?<n>)|}(?<-n>))+(?(n)(?!))*}", 
     RegexOptions.IgnoreCase, TimeSpan.FromSeconds(2));

добавляет тайм-аут (и тайм-аут работает).Это было добавлено в .NET 4.5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...