/ / Wydrukuj wzór regex, w którym ciąg staje się nieważny - c #, regex, automata

Wydrukuj wzór regex, w którym ciąg staje się nieważny - c #, regex, automata

Biorąc pod uwagę regularną ekspresję

^(aa|bb){1}(a*)(ab){1}$

Dla języka,

Wszystkie ciągi zaczynające się od podwójnych liter i kończące na podciągnięciu ab

Chciałbym wiedzieć, czy możliwe jest wydrukowanie kodu regex, w którym ciąg staje się nieważny. Ma to związek z wyrażeń regularnych w Finite Automata.

Na przykład mam następujący zestaw wejściowy nieprawidłowe ciągi,

abaa
aabb
aaba

Chciałem mieć takie wyjście,

abaa ^(aa|bb){1}
aabb ^(aa|bb){1}(a*)
aaba ^(aa|bb){1}(a*)(ab){1}$

Odpowiedzi:

1 dla odpowiedzi № 1

Możesz utworzyć Regex z ciągu, jeśli jest tozniekształcony wzór, który rzuci wyjątek. Możesz utworzyć pętlę, która ma zamiar pobrać podciąg wzoru i spróbować stworzyć wyrażenie regularne, jeśli nie powiedzie się, po prostu kontynuuj.

Gdy masz Regex, możesz przetestować dopasowanie i zapisać ostatni wzór pasujący do danych wejściowych. Więc byłoby coś takiego:

public static string FindBestValidRegex(string input, string pattern)
{
var lastMatch = "";

for (int i = 0; i < pattern.Length; i++)
{
try
{
var partialPattern = pattern.Substring(0, i + 1);
var regex = new Regex(partialPattern);

if (regex.IsMatch(input))
{
lastMatch = partialPattern;
}
}
catch { }
}

return lastMatch;
}

Testowanie:

static void Main(string[] args)
{
var pattern = @"^(aa|bb){1}(a*)(ab){1}$";

Console.WriteLine(FindBestValidRegex("bbb", pattern));
Console.WriteLine(FindBestValidRegex("aabb", pattern));
Console.WriteLine(FindBestValidRegex("aaab", pattern));
Console.WriteLine(FindBestValidRegex("bbaab", pattern));

Console.ReadKey();
}

Wydajność:

^(aa|bb){1}(a*)
^(aa|bb){1}(a*)
^(aa|bb){1}(a*)(ab){1}$
^(aa|bb){1}(a*)(ab){1}$