打印字符串无效的正则表达式模式

Print the regex pattern where the string becomes invalid

给定正则表达式

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

对于语言,

All strings starting with double letters and ends with substring ab

我想知道是否可以打印字符串无效的正则表达式代码。这与有限自动机中的正则表达式有关。

例如,我有以下这些无效字符串输入集,

abaa
aabb
aaba

我想要这样的输出,

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

您可以从字符串创建正则表达式,如果它是格式错误的模式,它将抛出异常。您可以创建一个循环,该循环将获取模式的子字符串并尝试创建一个正则表达式,如果失败则继续。

有了正则表达式后,您就可以测试匹配项并存储与输入匹配的最后一个模式。所以它会是这样的:

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;
}

测试:

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();
}

输出:

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