RE эффективны , но не волшебны: -)
Это не количество строк во входном файле, которое замедляет вас (3000 - это очень небольшое число). Когда RE компилируется, он в основном должен (концептуально) написать программу, которая может анализировать входной файл на основе этого RE.
Скорость этой «программы» всегда зависит от сложности RE.
Например, "^$"
будет очень быстрым, "[0-9]{1,9}"
будет несколько медленнее и все, что связано с возвратом (т. Е. Необходимо выполнить резервное копирование в RE, обычно что-либо, включающее несколько предложений с переменным числом элементов, из которых ваш пример) будет еще медленнее.
Все, что вы можете сделать заранее, чтобы минимизировать количество строк, в некоторой степени поможет, но с точки зрения оптимизации самого RE, это часто считается черным искусством. Одна из возможностей состоит в том, чтобы сначала обрезать линии, отличные от тех, которые находятся между строками, где Аннотация останавливается и начинается.
Я не слишком беспокоюсь об оптимизации моих RE (но обычно они не такие сложные). Я считаю, что они займут столько же времени, сколько и. Если это слишком долго, я обычно ищу другое решение, которое быстрее, но не настолько адаптируемо.
В случае вашего RE, где вы хотели получить все XML-комментарии, где атрибут about
содержит MATCH, я бы сделал это на Perl (или на awk для нас, старожилов :-), поскольку входной файл был разумно исправлен формат:
- «<Аннотация» в первой строке [a]. </li>
- "MATCH" также в первой строке [a].
- в последней строке и самостоятельно [b].
Это будет быстрый простой сканер строк, включающий эхо при выполнении условий [a] (и печать этой строки), печать любой другой строки при включенном эхо и отключение эха при условиях [b] выполнено (после печати строки).
Да, гораздо менее адаптируемый, но почти наверняка быстрее (учитывая ваш хорошо отформатированный ввод).