【问题标题】:removing #region删除#region
【发布时间】:2011-02-22 20:17:28
【问题描述】:

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

【问题讨论】:

  • 地区是坏事,还是你说的过度使用?在之前的项目中,我们被教导为每个类设置事件、构造函数、属性、公共方法、私有方法、私有变量的区域。
  • 我想这是一个品味问题。我只是看不出使用它们有什么好处。对我来说,看不到代码或点击区域打开它是令人不安的。
  • @JonWillis -- 总的来说,我不认为区域不好,但它们倾向于隐藏违反单一责任原则的行为。
  • @Austin,这是我从未考虑过的事实。我不是他们的回避支持者,但对使用它们没有反感。也许区域最适合不能因为一个原因而缩小的大类。正如我在小班上同意的那样,这是矫枉过正的,执行我们的政策并不总是那么容易。方法位于错误区域或区域外的情况并不少见,这增加了代码维护以符合政策。
  • @AndyM -- 我在哪里说过应该删除或避免它们?

标签: c# .net visual-studio-addins region


【解决方案1】:

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

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

要删除#endregion,请执行相同操作,但使用“\#endregion .*\n”作为您的模式。正则表达式可能对于#endregion 来说有点过头了,但不会有什么坏处(以防以前的开发人员将 cmets 与 #endregion 放在同一行或其他东西上)。


注意:其他人发布的模式也应该适合你,它们与我的略有不同,但你明白了。

【讨论】:

  • 是的...如果需要,它还具有有限的 RegEx 语法。
  • 使用适当的regexpwildcards
  • 这几乎令人尴尬。在 Visual Studio 的 10 年中,我从未使用过通配符/正则表达式搜索。 :-p
  • 可能需要在正则表达式的末尾添加\n,这样您就不会留下过多的空行。
  • 我只有在删除 endregion 之后的空格后才能正常工作
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 您先生,是救生员!如果每个方法都包装在一个区域中,我必须继承一个项目。每一种方法!
  • 我在 # 和 (region) 之间添加了另一个 [ \t]* -> 显然它在那里有空格也是有效的,并且我继承了我必须清理的代码的开发人员非常不一致。我使用的完整表达式:^[ \t]*\#[ \t]*(region|endregion).*\n
  • 真的很棒 :) (Y)
  • 你第一段的正则表达式对我有用。非常感谢。
【解决方案3】:

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

【讨论】:

  • [^] 在查找和替换中的作用是什么?
  • @Timwi [^...] Matches any character that is not in the set of characters that follows the ^。所以在这种情况下,集合是空的,所以匹配该行中的所有内容。
  • {[#]<region.*} 是等价的,但由于某种原因,我习惯了另一种方式。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    More info on JetBrains.

    【讨论】:

    • 太棒了! R# 现在有这么多很酷的功能,以至于我已经忘记了所有可能的功能。
    【解决方案6】:

    若要删除 #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
    

    【讨论】:

      【解决方案7】:

      如何为它编写自己的程序,以递归方式替换 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")
      

      【讨论】:

        【解决方案8】:

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

        *\#region *
        *\#endregion
        

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 2010-10-19
        • 1970-01-01
        • 2011-02-22
        相关资源
        最近更新 更多