如何将项目添加到树视图而不将其复制到具有相同名称的其他节点

时间:2015-02-28 07:38:21

标签: c# regex treeview treenode

我的编码问题。我想使用正则表达式和c#将项添加到treeview。但问题是要添加的节点具有相同的名称。

  

代码::

  treeView1.Nodes.Clear();
  string name;
  TreeNode Root = new TreeNode();
  RootNode.Text = "RootNode";
  treeView1.Nodes.Add(RootNode);
  MatchCollection ToGetPulinName = Regex.Matches(richtextbox1.Text,@"pulin (.*?)\{");
  foreach (Match m in ToGetPulinName)
    {
     Group g = m.Groups[1];
     name= g.Value;
     TreeNode SecondRoot = new TreeNode();
     SecondRoot.Text = "PulinRoot:"+pulinname;
     RootNode.Nodes.Add(SecondRoot);
     MatchCollection ToFoundIn = Regex.Matches(codingtxt.Text, @"pulin \w+{(.*?)}", RegexOptions.Singleline);
     foreach (Match min in ToFoundIn)
      {
       Group gMin = min.Groups[1];
       string gStr = gMin.Value;
       string classname;
       MatchCollection classnames = Regex.Matches(codingtxt.Text, @"class (.*?)\{", RegexOptions.IgnoreCase);
       foreach (Match mis in classnames)
        {
         Group gmis = mis.Groups[1];
         classname = gmis.Value;
         TreeNode ClassRoot = new TreeNode();
         ClassRoot.Text = "ClassRoot";
         SecondRoot.Nodes.Add(ClassRoot);
        }
       }
      }
  

结果

enter image description here

请帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

问题在于如何使用正则表达式解析数据,而不是辅助树视图,这在这里不是真正的问题。

使用以下模式,我们将搜索您的文本并将所有数据分组/提取出来,直到我称之为名称空间及其相关类。

在使用(?< > ) 命名匹配捕获的模式中,我们可以更轻松地提取数据。以下内容创建了一个动态的linq entites来保存我们的数据。我正在展示Linqpad Dump()扩展的结果,它为我们提供了数据。此外,我还为Tester添加了另一个类:

var data = @"
pulin Tester  { class Main { } class Omega{} }
pulin Tester2 { }
";

var pattern = @"
pulin\s+                   # Look for our anchor `pulin` which identifies the current namespace,
                           # it will designate each namespace block
(?<Namespace>[^\s{]+)      # Put the namespace name into the named match capture `Namespace`.
    (                      # Now look multiple possible classes
      .+?                  # Ignore all characters until we find `class` text
      (class\s             # Found a class, let us consume it until we find the textual name.
         (?<Class>[^\{]+)  # Insert the class name into the named match capture `Class`.
      )
    )*                     # * means 0-N classes can be found.
                    ";

// We use ignore pattern whitespace to comment the pattern.
// It does not affect the regex parsing of the data.
Regex.Matches(data, pattern, RegexOptions.IgnorePatternWhitespace)
     .OfType<Match>()
     .Select (mt => new
     {
        Namespace = mt.Groups["Namespace"].Value,
        Classes   = mt.Groups["Class"].Captures
                                      .OfType<Capture>()
                                      .Select (cp => cp.Value)
     })
     .Dump();

Dump()的结果,最终你将遍历以填充树。:

enter image description here

我留给您使用数据正确填充树。


注意我会疏忽提醒你,使用正则表达式进行词法解析有其固有的缺陷,最终使用适合这项工作的真正解析工具会更好。