【问题标题】:Print the regex pattern where the string becomes invalid打印字符串无效的正则表达式模式
【发布时间】:2017-11-23 13:40:50
【问题描述】:

给定正则表达式

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

对于语言,

所有以双字母开头并以子字符串ab结尾的字符串

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

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

abaa
aabb
aaba

我想要这样的输出,

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

【问题讨论】:

  • aabb ^(aa|bb){1}(a*) 对于这个,字符串变得无效的模式并不是真的在这一点上,是吗?那和你的表达本身是无效的。它有不平衡的括号。
  • 先生@Jerry 我已经编辑了不平衡的括号,我可以澄清一下它在哪里无效?
  • @ctwheels 很抱歉,但我可以知道这个正则表达式的意义何在?
  • 啊,感谢您的澄清。这与我认为你想要的不同。我建议将您的正则表达式分成多个部分,并使用字符串函数来拆分字符串并测试每个部分。因此,对于abaa,您将拆分并获得ab 并使用正则表达式^(aa|bb)(注意{1} 不是必需的,实际上是多余的)。此外,并不是说使用^(a{2}|b{2}) 性能更好。这可以指示字符串的哪一部分格式错误。

标签: c# regex automata


【解决方案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}$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多