Используйте foreach поверх зависания MatchCollection в одном приложении, но не в другом - PullRequest
1 голос
/ 07 августа 2011

Я только что столкнулся с самой странной проблемой в моей жизни кодирования, я использую библиотеку подсветки кода в проекте, в котором я пытался настроить средство просмотра кода SQL.Я взял образец формы из образца и поместил его в проект, и зависание формы при запуске.Но тот же самый пример отлично работает в примере проекта, поставляемого с библиотекой.Оба приложения Winform.И дальнейшее расследование показывает мне, что код зависает в самой библиотеке, а не код, который находится в образце формы

var matches = regex.Matches(text);
foreach (Match m in matches) // Here it hangup
{
    ...
}

Но то же самое место работает так же быстро, как это может быть при запуске образцаWinform приложение поставляется с библиотекой.Я весьма озадачен.Я думаю, что что-то базовое, как Regex, должно работать одинаково, независимо от того, в каком приложении.Текст не длинный, всего несколько сотен символов.И регулярное выражение то же самое.Я не делал ничего иначе, кроме того, что я извлекаю образец формы, помещаю его в свой проект и вызываю его.

Может ли кто-нибудь помочь мне или указать мне правильное направление?

1 Ответ

1 голос
/ 07 августа 2011

Ваше предположение, что что-то "такое же базовое, как регулярные выражения" будет одинаково работать в разных реализациях, неверно по нескольким причинам:

  • Регулярные выражения больше не являются регулярными. Современные дополнения, такие как обратные ссылки, обходные выражения, рекурсивное сопоставление с образцами и т. Д., Значительно расширили базовые регулярные выражения десятилетия назад.
  • Существует десятков разновидностей регулярных выражений , каждая из которых реализует различное подмножество функций, многие из которых интерпретируют одни и те же токены по-разному. Для вас разница между регулярными выражениями JavaScript (на стороне клиента) и .NET (на стороне сервера), вероятно, самая важная, и мальчик, эти два различия.
  • Существует множество параметров, которые можно установить (например, соответствует ли точка символу новой строки или нет), которые будут влиять на соответствие регулярного выражения (и могут сильно влиять на производительность), и вам необходимо убедиться, что эти параметры установлены правильно.

Скорее всего, вы столкнулись с проблемой, которая называется катастрофическое возвращение назад . "Зависание" внутри самой библиотеки часто вызывается этим. Чтобы выяснить, так ли это, и как это исправить, нам нужно увидеть ваше регулярное выражение, объяснение того, что вы пытаетесь с ним сделать, и / или образец входного текста, с которым у него проблемы. Пожалуйста, отредактируйте свой вопрос и добавьте эти детали.

...