【问题标题】:Regular expression for treeview树视图的正则表达式
【发布时间】:2014-02-26 10:41:40
【问题描述】:

我尝试解析这样的字符串:

"#1#Process#{some process|info}{some name|some info {child info|child info}}{some name|some info}"

在几条消息中创建这样的字符串:

#1#Process#
-some process|info
-some name|some info
   -child info|child info
-some name|some info

我正在尝试使用 RegExp 和以下代码:

using System;
using System.Collections;
using System.Text.RegularExpressions;

namespace prRegEXP
{
    class Program
    {
        static String st="";

        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            // TODO: Implement Functionality Here
            var pattern = @"\{(.*?)\}";
            var query = "#1#Process#{some process|info}{some name|some info {child info|child info}}{some name|some info}";
            FindTree (pattern, query);
            Console.WriteLine(st);
            Console.WriteLine();
            Console.WriteLine("Press any key to continue . . . ");
            Console.ReadKey(true);
        }       


        private static void FindTree (String pattern, String query) {
            var matches = Regex.Matches(query, pattern);            
            foreach (Match m in matches) {
                st += m.Groups[1] + "\n";

                if (Regex.IsMatch(m.Groups[1].ToString(), @"\{(.*?)" )) {                   
                    FindTree (@"\{(.*?)", m.Groups[1].ToString());

                }    
            }
        }
    }
}

它基于我发现的example solution,我想创建一些消息树来处理内部消息(如child info|child name)。而且可能有很多。

我不知道如何匹配子表达式并将其以递归参数发送。有什么想法或解决方法吗?

【问题讨论】:

  • +1 表示查询字符串!
  • 您可以通过使用递归正则表达式来实现这一点,但它需要很好的理解才能有效地工作(即使语言支持 - 递归捕获组的检索可能会很棘手)。没有它 - 你可以为你的 2-depth 示例构建一个 2-depth 模式,但是用 depth-counter 编写一个适当的标记器会容易得多......

标签: c# regex treeview


【解决方案1】:

编写一个简单的正则表达式来支持 N 深度递归是不可能的(?)或者至少非常困难。

一个更简单的解决方案是,一个字符一个字符地遍历字符串,并在找到新消息时插入缩进和换行符。

类似的东西应该可以工作:

private static String FindTree(String query)
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    String indent = "";
    foreach (var ch in query)  {
        if (ch == '{') {
            sb.Append("\n");
            sb.Append(indent);
            sb.Append("- ");
            indent += "\t";
        } else if (ch == '}') {
            indent = indent.Substring(1);
        } else {
            sb.Append(ch);
        }
    }
    return sb.ToString();
}

上面的代码没有经过测试,也不是我精通C#,所以可能会出错,但应该能说明基本思想。

【讨论】:

  • 不幸的是我需要 RE 的解决方案
  • @Kaha,RE 不是进行完整解析的好工具,尽管您可以在解析期间有效地使用它进行标记化,例如([{\|}]|[^{\|}]+) 之类的东西(不确定 C# 转义)可以改进 rvalvik 建议的方法,从 char-by-char 到 string-by-string 模式。
  • 感谢大家。我们已经有了没有 RE 的解决方案,所以我想知道如何使用 RE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
相关资源
最近更新 更多