Удаление # регион

Я должен был взять на себя проект AC#. Парень, который разработал программное обеспечение, был глубоко влюблен в #region потому что он завернул все с регионами. Это сводит меня с ума, и я искал инструмент или аддон, чтобы удалить все #region из проекта. Есть ли что-то вокруг?

8 ответов

Решение

Просто используйте встроенную в Visual Studio функцию "Найти и заменить" (или "Заменить в файлах", которую вы можете открыть, нажав Ctrl + Shift + H).

Удалять #regionвам нужно будет включить сопоставление регулярных выражений; в диалоговом окне "Заменить в файлах" установите флажок "Использовать: регулярные выражения". Затем используйте следующий шаблон: "\#region .*\n", заменяя спички на "" (пустая строка).

Удалять #endregion, делай то же самое, но пользуйся\#endregion .*\n"как ваш шаблон. Регулярные выражения могут быть излишними для #endregion, но это не повредит (в случае, если предыдущий разработчик когда-либо оставлял комментарии в той же строке, что и #endregion или что-то).


Примечание: другие опубликовали шаблоны, которые также должны работать для вас, они немного отличаются от моих, но вы поймете общую идею.

Используйте одно регулярное выражение ^[ \t]*\#[ \t]*(region|endregion).*\n найти и регион, и регион. После замены на пустую строку вся строка с начальными пробелами будет удалена.

[ \t]* - находит ведущие пробелы

\#[ \t]*(region|endregion) - находит #region или #endregion (а также очень редкий случай с пробелами после #)

.*\n - находит все после #region или #endregion (но в той же строке)

РЕДАКТИРОВАТЬ: Ответ изменен, чтобы быть совместимым со старым синтаксисом регулярных выражений Visual Studio. Было: ^[ \t]*\#(end)?region.*\n (вопросительные знаки не работают для старого синтаксиса)

РЕДАКТИРОВАТЬ 2: Добавлено [ \t]* после # для обработки очень редкого случая, найденного @Volkirith

В поиске и замене использования {[#]<region[^]*} за Find what: и замените его пустой строкой.#EndRegion достаточно просто заменить.

Для тех, кто использует ReSharper, это просто Atr-Enter в строке региона. После этого у вас будет возможность удалить области в файле, проекте или решении.

Больше информации о JetBrains.

Если вам придется сотрудничать с любителями регионов (и не затрагивать регионы), я бы порекомендовал расширение Visual Studio "Я ненавижу #Regions". Это делает регионы терпимыми - все регионы расширяются по умолчанию, а директивы #region отображаются очень маленьким шрифтом.

Как насчет того, чтобы написать для него свою собственную программу, чтобы рекурсивно заменять пустые регионы во всех файлах * .cs в basePath?
(Подсказка: будьте осторожны с чтением файлов как UTF8, если это не так.)

      public static void StripRegions(string fileName, System.Text.RegularExpressions.Regex re)
{
    string input = System.IO.File.ReadAllText(fileName, System.Text.Encoding.UTF8);
    string output = re.Replace(input, "");
    System.IO.File.WriteAllText(fileName, output, System.Text.Encoding.UTF8);
}


public static void StripRegions(string basePath)
{
    System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex(@"(^[ \t]*\#[ \t]*(region|endregion).*)(\r)?\n", System.Text.RegularExpressions.RegexOptions.Multiline);

    foreach (string file in System.IO.Directory.GetFiles(basePath, "*.cs", System.IO.SearchOption.AllDirectories))
    {
        StripRegions(file, re);
    }
}

Использование:

      StripRegions(@"C:\sources\TestProject")

Чтобы удалить #region с символом новой строки после него, замените следующий текст пустой строкой:

^(?([^\r\n])\s)*\#region\ ([^\r\n])*\r?\n(?([^\r\n])\s)*\r?\n

Чтобы заменить #endregion на начальную пустую строку, замените следующую на пустую строку:

^(?([^\r\n])\s)*\r?\n(?([^\r\n])\s)*\#endregion([^\r\n])*\r?\n

Вы можете использовать подстановочный знак найти / заменить:

*\#region *
*\#endregion

И заменить без значения. (Обратите внимание # необходимо экранировать, так как visual stuido использует его для сопоставления с "любым числом")

Другие вопросы по тегам