Какое регулярное выражение дает результат между 2 строками шаблона?

#regex #sublimetext3 #regex-lookarounds

Вопрос:

Кратко

Я пытаюсь настроить Sublime Text 4, чтобы скрыть области в коде. Для этого я использую расширение AutoFold, которое может сворачивать фрагменты кода в соответствии с указанными регулярными выражениями. Мне нужно регулярное выражение, которое будет содержать содержимое между 2 строками, где первая содержит #region , а последняя содержит #endregion .

Ближе к теме:

Там есть фрагмент кода:

 -- #region NAME 1
line 1
line 2
-- #endregion

line 3

-- #region NAME 2
line 4
line 5
-- #endregion
 

Я хочу получить результат, как показано на рисунке

желаемый результат

Для демонстрации я использую 2 регулярных (?<=-- #region NAME 1)(.|n)*?(?=-- #endregion) выражения и (?<=-- #region NAME 2)(.|n)*?(?=-- #endregion) .

Вопрос

Как должно выглядеть регулярное выражение, которое даст тот же результат?

Как я старался:

  1. (?<=-- #region )(.|n)*?(?=-- #endregion) дает аналогичный результат, но скрывает название региона, что меня не устраивает🙁
  2. (?<=n)[^$] удаляет начало строки перед первой n . Это похоже на то, что вместе с шагом 1 решит мою проблему, но я не могу объединить это в одном выражении🙁 Я попробовал что-то вроде этого:: (?<=-- #region )((?<=n)[^$] )(?=-- #endregion)
  3. ^.*#region.*n дает полную строку, содержащую регион и название, но ее также невозможно составить с помощью пункта 1 🙁 попробовал что-то вроде этого: (?<=(^.*#region.*n))(.|n)*?(?=-- #endregion)

Ответ №1:

Вы можете сопоставить всю строку с — #регионом до конца. Затем вы можете использовать K для очистки буфера совпадения и сопоставления до первого появления — #endregion

 -- #region . K[sS]*?(?=-- #endregion)
 

Демонстрация регулярных выражений

Учет новых строк:

 -- #region . RK[sS]*?R(?=-- #endregion)
 

Демонстрация регулярных выражений