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 № 1Moż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}$