Я бы добавил к регулярному выражению отрицательное предпросмотр, чтобы убедиться, что вы действительно можете сопоставить \r\n
в текущей позиции.В противном случае движок должен выполнить весь просмотр назад (произвольный размер для загрузки) для каждого отдельного символа во всем файле, только чтобы выяснить, что возврат каретки не подлежит замене.
(?=\r\n)(?(?<=<SOURCE>(?:(?!</?SOURCE>).)*)(\r\n))
должно быть намного быстрее.По крайней мере, в RegexBuddy движку regex требуется намного меньше шагов для завершения матча.Если этого не происходит в .NET, я не знаю почему.Возможно, условное регулярное выражение не так эффективно (я должен признать, что сначала я его не распознал и подумал, что в вашем регулярном выражении есть синтаксическая ошибка).Я думаю, что вам не нужно условное регулярное выражение в этом сценарии.Как насчет
\r\n(?<=<SOURCE>(?:(?!</?SOURCE>).)*)
Это быстрее?Я предполагаю, что вы используете RegexOptions.Singleline
для компиляции регулярного выражения.
Если нет, то, вероятно, очень много возвратов каретки и много других символов внутри ваших блоков <SOURCE>
, а также произвольныйРазмер смотреть назад просто занимает много времени.Тогда мое другое предложение состоит в том, чтобы разделить задачу:
- Соответствует блоку
<SOURCE>
- Заменить все CRLF внутри блока (не требуется регулярное выражение)
- Заменить
<SOURCE>
блок