locked
При вычислении регулярных выражений программа зависает при попытке произвести сопоставление с использованием выражения разработчика. Почему это происходит? RRS feed

  • Общие обсуждения

  • На самом деле, программа не зависает, просто начинает работать очень медленно. Теоретически возможно написать выражение, в которых время исполнения растет эскпоненциально вместе с длинной строки поиска. Обычно это вызывается наличием каких-либо вложенных кванторов. Например, нижеследующий код демонстрирует простое выражение со вложенным квантором:

     

    [VB]
    Dim r As Regex = New Regex("(.*)+q")
    For i As Integer = 0 to 50
      Dim s As String = New String ('a', i)
      Dim start As DateTime = DateTime. Now
      r.Match(s)
      Dim fin As DateTime = DateTime.Now
      Console.WriteLine(fin -start)
    Next

    Этот код создает строки возрастающей длины, содержащие только букву «a». Отметьте, что регулярное выражение не совпадет с ними, поскольку оно требует, чтобы строка заканчивалась на «q». Выполняя этот фрагмент, можно заметить, что после нескольких повторов на коротких строках завершение каждого вызова к r.Match(s) начинает занимать много времени. Каждая добавленная буква удваивает его.

    Решение заключается в полном избавлении от вложенных кванторов. Обычно это не проблема, поскольку большинство выражений можно написать без них. Если же в определенном случае без них не обойтись, то мы бы с удовольствием об этом узнали.


    Для связи [Mail]
    • Перемещено Tagore Bandlamudi 3 октября 2010 г. 0:57 MSDN Forums consolidation (От:Форум по .NET Framework)
    18 февраля 2010 г. 12:41
    Модератор