44

我不得不接管 ac# 项目。最初开发该软件的人深深地爱上了他,#region因为他用区域包装了所有东西。这让我几乎疯了,我正在寻找一个工具或插件来#region从项目中删除所有内容。周围有东西吗?

4

8 回答 8

67

只需使用 Visual Studio 内置的“查找和替换”(或“在文件中替换”,您可以按Ctrl+ Shift+打开H)。

要删除#region,您需要启用正则表达式匹配;在“替换文件”对话框中,选中“使用:正则表达式”。然后,使用以下模式:“ \#region .*\n”,将匹配项替换为""(空字符串)。

要删除#endregion,请执行相同操作,但使用 " \#endregion .*\n" 作为您的模式。正则表达式对于 来说可能是多余的#endregion,但它不会受到伤害(以防以前的开发人员曾经在与 an#endregion或其他内容相同的行上留下评论)。


注意:其他人发布的模式也应该对你有用,它们与我的略有不同,但你明白了一般的想法。

于 2011-02-22T20:20:14.043 回答
37

使用一个正则表达式^[ \t]*\#[ \t]*(region|endregion).*\n同时查找:region 和 endregion。替换为空字符串后,将删除带有前导空格的整行。

[ \t]*- 找到前导空格

\#[ \t]*(region|endregion)- 查找#region 或#endregion(也非常罕见的情况是# 后面有空格)

.*\n- 查找 #region 或 #endregion 之后的所有内容(但在同一行)

编辑:答案更改为与旧的 Visual Studio 正则表达式语法兼容。是:(^[ \t]*\#(end)?region.*\n问号不适用于旧语法)

编辑2:[ \t]*在# 之后添加以处理@Volkirith 发现的非常罕见的情况

于 2012-11-14T16:19:37.393 回答
4

在查找和替换中,使用{[#]<region[^]*}forFind what:并将其替换为空字符串。 #EndRegion很简单,可以更换。

于 2011-02-22T20:21:22.737 回答
4

如果您必须与区域爱好者合作(并保持区域不变),那么我会推荐“我讨厌 #Regions” Visual Studio 扩展。它使区域可以容忍 - 默认情况下所有区域都被扩展,#region 指令以非常小的字体呈现。

于 2016-02-04T18:08:41.413 回答
4

对于任何使用 ReSharper 的人来说,这只是区域线上的一个简单的 Atr-Enter。然后,您可以选择删除文件、项目或解决方案中的区域。

有关 JetBrains 的更多信息

于 2016-06-03T10:11:51.667 回答
0

要删除带有换行符的#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
于 2016-12-09T17:13:24.010 回答
0

如何为它编写自己的程序,以递归方式替换 basePath 中所有 *.cs 文件中没有任何内容的区域?
(提示:如果不是 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")
于 2021-10-05T12:23:20.797 回答
-2

您可以使用通配符查找/替换:

*\#region *
*\#endregion

并替换没有价值。(注意#需要转义,因为visual stuido使用它来匹配“任何数字”)

于 2011-02-22T20:24:23.580 回答