【问题标题】:Matching a class with Regex in C#在 C# 中将类与正则表达式匹配
【发布时间】:2014-09-22 16:15:13
【问题描述】:

我正在寻找一种方法来匹配一个完整的类,从第一个括号开始,到右括号结束。我需要这个作为加载项,以限制加载项应该应用到的区域。我的问题是,在这些类中,可能有额外的“子类”,也有括号打开和关闭。我需要一种方法来计算它们并忽略它们,直到找到第一类的右括号。

例子:

public class Test
**{**

 doSomeThing();

 private partial class Test2
   {
     doSomeThing2();
   }
**}**

我需要从第一个标记的括号到最后一个括号的匹配项。

感谢您的帮助!

【问题讨论】:

  • Regex here?.这是一个非常糟糕的主意。在它爆炸之前放弃这种方法。
  • 我不认为用正则表达式解析 C# 语法是个好主意。我会使用Roslynstackoverflow.com/questions/16338131/…
  • Regex 会为我提供课程的确切开始和结束索引,这正是我正在寻找的。​​span>
  • @T4R3K 为什么需要类的开始和结束索引?
  • @Rawling 我正在开发一个 Visual Studio 插件,它在当前打开的文档的代码中“编辑、排序和查找某些内容”。整个加载项工作正常,但我唯一的问题是加载项正在查看当前打开的整个文档,Regex 需要很长时间才能查看它。我希望用户指定加载项应在哪个类中查找。

标签: c# regex class


【解决方案1】:

不使用任何正则表达式如何计算大括号?与构建算术表达式验证器时的操作方式相同,只是在这种情况下,您必须跳过被注释掉的括号或字符串文字内的括号。

【讨论】:

    【解决方案2】:

    感谢balancing groups,您可以通过正则表达式做到这一点。

    这是 C# 特有的功能,专门用于递归模式(例如问题中的嵌套大括号,或 MSDN 示例中的嵌套 XML 标记)。

    但请注意,C# 在这里是个例外:正则表达式通常不支持递归(除非硬编码为有限深度)。

    【讨论】:

      【解决方案3】:

      遇到左大括号时增加计数,遇到右大括号时减少计数:

              var braceCount = 0;
              var nextChar = "{";
              do
              {
                  if (nextChar == "{") braceCount++;
                  if (nextChar == "}") braceCount--;
                  nextChar = GetNextChar();
              }
              while (braceCount > 0);
      

      我也得到了一个很好的正则表达式结果,但不明白为什么,比赛应该在第一个右括号处停止。在我的正则表达式测试器中,使用选项 .net、C#、点匹配所有字符,包括换行符:http://www.myregextester.com/index.php

      全选(复制等) 原始匹配模式: {.*}

      C#.NET 代码示例:

      using System;
      using System.Text.RegularExpressions;
      namespace myapp
      {
        class Class1
          {
            static void Main(string[] args)
              {
                String sourcestring = "source string to match with pattern";
                Regex re = new Regex(@"{.*}",RegexOptions.Singleline);
                MatchCollection mc = re.Matches(sourcestring);
                int mIdx=0;
                foreach (Match m in mc)
                 {
                  for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
                    {
                      Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
                    }
                  mIdx++;
                }
              }
          }
      }
      

      找到匹配项:

      [0][0] = {**
      
       doSomeThing();
      
       private partial class Test2
         {
           doSomeThing2();
         }
      **}
      

      【讨论】:

      • 您的正则表达式不会停止,因为默认情况下 *贪婪的 - 它在允许 } 匹配之前尽可能多地消耗。因此,除非该类是文件中的单个(或最后一个)顶级项(没有命名空间!),否则这将不起作用
      • 谢谢,看来这将适用于给定的场景。虽然在它周围有命名空间的情况下并不理想。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多