【问题标题】:C# tree data structure where for regular expression generation用于生成正则表达式的 C# 树数据结构
【发布时间】:2010-11-07 03:16:54
【问题描述】:

我正在尝试根据一些已知文本生成正则表达式。我假设我可以将文本加载到树结构中并查看生成了什么样的树,但我有一个我似乎无法弄清楚的问题:我希望表兄弟们被连接在一起。

例如:

ZABCDEF
ZBCCEFG

会导致:

A-B- D-E-F Z-C- B-C-E-F-G

我不希望进行任何排序,因为目标是按原样匹配文本。任何提示将不胜感激。

【问题讨论】:

  • 字符串是否总是相同的长度?
  • 不,它们的范围是 5-10 个字符。

标签: c# tree structure expression


【解决方案1】:

会更容易知道你想从你写的结果树中创建什么类型的正则表达式,但我认为一棵树比你需要的要多一些。

假设您希望相同的值成为正则表达式的锚点,那么您需要做的就是跟踪字符串中特定索引处的字符何时相同。这可以用一些数据类型来跟踪,但最容易解释的只是一个布尔值数组(如果所有字符串的长度不同,那么你会希望布尔数组的长度是第二大的字符串,而不是最大的(没有任何东西会匹配它的尾随字符)。默认情况下,它们被初始化为 false,然后您可以遍历给定的字符串,并且当索引处的所有字符都相同时,将布尔值设置为 true。

然后,要使用所有字符串中相同的字符构建正则表达式,您可以检查布尔数组以查看是否可以将值直接放入表达式中,或者是否需要处理不同字符串之间的选择...请注意,此处理也可以内联完成,不需要再次跟踪数据和处理字符串。

如果这是在正确的方向,或者如果您可以提供更多信息以向我们发送正确的方向,我可以回来并快速编写一些代码。

编辑:只是一些代码来解释我在说什么

string s1 = "ZABCDEF";
string s2 = "ZBCCEFG";
StringBuilder sb = new StringBuilder();

for (int i = 0; i < s1.Length; ++i)
{
    if (s1[i] == s2[i])
    {
        sb.Append(s1[i]);
        Console.WriteLine("  " + s1[i]);
    }
    else
    {
        sb.Append("[" + s1[i] + s2[i] + "]");
        Console.WriteLine(s1[i] + "   " + s2[i]);
    }
}

Console.WriteLine(sb);

输出垂直图表以及匹配任一字符串的结果表达式。

  Z
A   B
B   C
  C
D   E
E   F
F   G
Z[AB][BC]C[DE][EF][FG]

【讨论】:

  • 大约有 30K 字符串需要比较 :)。我明白你在做什么,我想我可以通过一些公式重复使用它。
  • 希望对您有所帮助,我认为在一天结束时还有更多的字符串要在整个过程中运行,但对数据进行两次传递只是违背我的本性 :) 我唯一要补充的是要注意 C# 中正则表达式的速度。我可以在网上找到的信息只是索引处理速度更快。 (我正在重写一个 JSON 解析器,因为它需要比现在快很多:))
【解决方案2】:

这不是叫跳过列表吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多