确定最适合正则表达式

时间:2013-07-15 14:24:14

标签: regex

我正在尝试创建一种机制,可以确定字符串的匹配程度,并确定最佳匹配。例如:

输入

AAAB, AACS, BBBB, ZZZZZ

4条规则

  1. AA *
  2. AAA *
  3. BB *
  4. *
  5. 输出

    AAAB -> 2, AACS -> 1, BBBB -> 3, ZZZZZ -> 4
    

    是否可以使用正则表达式确定这一点?

4 个答案:

答案 0 :(得分:1)

没有“最合适”的正则表达式。如果你想要速度,你唯一能做的就是对不同的正则数据进行基准测试,看看哪一个是最快的。

<强>更新 看到你真正想要的东西。这不能用正则表达式来完成,这需要使用通常的逻辑来完成。

答案 1 :(得分:1)

HeJ小鼠, 我创建了以下代码。

首先我替换所有特殊字符,然后检查它是否匹配,当它匹配时我要确定匹配的大小,我通过计算*字符旁边的剩余字符来做到这一点。

 public Int32 GetMatchQuota(string d)
    {
        Int32 retval = -1;
        string regMask = String.Format("^{0}$", Destination.Replace(".", "\\.").Replace("*", ".*").Replace("%", "."));

        if (Regex.IsMatch(d, regMask, RegexOptions.IgnoreCase))
        {
            retval = regMask.Replace("*", string.Empty).Length;
            if (!regMask.Contains("*") || !regMask.Contains("%"))
            {
                retval += 1;
            }
        }

        return retval;
    }

答案 2 :(得分:0)

没有正则表达式。这只会是一场比赛。没有“更好”匹配的概念。但是,如果您事先知道正则表达式,则可以确定哪些正则表达式更严格。

检查每一个是否匹配,然后选择最严格的匹配。就你的例子而言:

2 > (1 = 3) > 4

如果2获得匹配,那么它就是最合适的。 13永远不会匹配相同的内容,但它们同样严格。 4是最不严格的,因此如果它是唯一匹配,那么它将是最合适的。

答案 3 :(得分:0)

从您的示例中,您似乎只想找到最合适的一个。

我建议按特异性的升序创建一个正则表达式列表,并对您的测试用例运行多次传递。成功的第一个正则表达式将是“最合适的”。

在您给出的示例中,您可以按如下方式订购正则表达式:

  1. BB *
  2. AAA *
  3. AA *
  4. *
  5. 然后,对于测试用例AACS,你会看到它与正则表达式1或正则表达式2不匹配,但它确实与正则表达式3匹配。所以最适合的是正则表达式3,即使它匹配正则表达式4如果它已经到了那么远。

    当然这取决于你正在使用的正则表达式,你必须自己决定如何订购你的正则表达式。