C # древовидная структура данных, где для генерации регулярных выражений - PullRequest
0 голосов
/ 07 ноября 2010

Я пытаюсь генерировать регулярные выражения на основе некоторых известных текстов. Я предположил, что могу загрузить текст в древовидную структуру и посмотреть, какое дерево генерируется, но у меня есть одна проблема, которую я не могу понять: я хочу, чтобы кузены были объединены.

Например:

ZABCDEF
ZBCCEFG

приведет к:

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

Я не хочу выполнять сортировку, поскольку цель состоит в том, чтобы сопоставить текст как есть. Любые советы будут наиболее цениться.

Ответы [ 2 ]

1 голос
/ 07 ноября 2010

Было бы проще узнать, какой тип регулярного выражения вы хотели бы сделать из этого результирующего дерева, которое вы написали, но я думаю, что дерево немного больше, чем вам нужно для этого.

Предполагая, что вы хотите, чтобы одинаковые значения были якорями регулярного выражения, тогда все, что вам нужно сделать, - это отслеживать, совпадают ли символы в определенном индексе в строках. Это можно отследить с помощью нескольких типов данных, но самый простой для объяснения - это просто массив логических значений (если все строки имеют разную длину, вы бы хотели, чтобы длина логического массива равнялась размеру второго по величине). строка, а не самая большая (ничто никогда не будет соответствовать последним символам). По умолчанию они инициализируются как 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]
0 голосов
/ 07 ноября 2010

Разве это не называется списком пропусков?

...