2

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

输入

AAAB, AACS, BBBB, ZZZZZ

4条规则

  1. AA*
  2. AAA*
  3. BB*
  4. *

输出

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

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

4

4 回答 4

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;
    }
于 2013-07-18T07:59:30.627 回答
1

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

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

于 2013-07-15T14:29:39.913 回答
0

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

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

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

  1. BB*
  2. AAA*
  3. AA*
  4. *

然后对于测试用例 AACS,您会看到它不匹配正则表达式 1 或正则表达式 2,但它确实匹配正则表达式 3。所以最适合的是正则表达式 3,即使如果它匹配正则表达式 4已经走到那一步了。

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

于 2013-07-15T14:41:54.380 回答
0

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

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

2 > (1 = 3) > 4

如果2有比赛,那是最合适的。 1并且3永远无法匹配相同的东西,但它们同样严格。 4是最不严格的,因此只有当它是唯一匹配时才会是最合适的。

于 2013-07-15T14:32:10.973 回答