我正在尝试创建一种机制,可以确定字符串匹配的好坏,并确定最佳匹配。例如:
输入:
AAAB, AACS, BBBB, ZZZZZ
4条规则:
- AA*
- AAA*
- BB*
- *
输出:
AAAB -> 2, AACS -> 1, BBBB -> 3, ZZZZZ -> 4
是否可以用正则表达式确定这一点?
我正在尝试创建一种机制,可以确定字符串匹配的好坏,并确定最佳匹配。例如:
输入:
AAAB, AACS, BBBB, ZZZZZ
4条规则:
输出:
AAAB -> 2, AACS -> 1, BBBB -> 3, ZZZZZ -> 4
是否可以用正则表达式确定这一点?
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;
}
没有“最合适”的正则表达式这样的东西。如果你想要速度,你唯一能做的就是对不同的正则表达式进行基准测试,看看哪些是最快的。
更新: 在看到你真正想要的东西之后。这不能用正则表达式来完成,这需要使用通常的逻辑来完成。
从您的示例中,您似乎只想找到最适合的示例。
我建议按特异性升序创建一个正则表达式列表,并在您的测试用例上运行多次。第一个成功的正则表达式将是“最合适的”。
在您提供的示例中,您可以按如下方式订购正则表达式:
然后对于测试用例 AACS,您会看到它不匹配正则表达式 1 或正则表达式 2,但它确实匹配正则表达式 3。所以最适合的是正则表达式 3,即使如果它匹配正则表达式 4已经走到那一步了。
当然,这取决于您使用的正则表达式,您必须自己决定如何订购您的正则表达式。
不是用正则表达式。这只会是一场比赛。没有“更好”匹配的概念。但是,如果您事先知道正则表达式,则可以确定哪些正则表达式更严格。
只需检查每个匹配项是否匹配,然后选择最严格的匹配项。就你的例子而言:
2 > (1 = 3) > 4
如果2
有比赛,那是最合适的。 1
并且3
永远无法匹配相同的东西,但它们同样严格。 4
是最不严格的,因此只有当它是唯一匹配时才会是最合适的。