我正在尝试创建一种机制,可以确定字符串的匹配程度,并确定最佳匹配。例如:
输入:
AAAB, AACS, BBBB, ZZZZZ
4条规则:
输出:
AAAB -> 2, AACS -> 1, BBBB -> 3, ZZZZZ -> 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
获得匹配,那么它就是最合适的。 1
和3
永远不会匹配相同的内容,但它们同样严格。 4
是最不严格的,因此如果它是唯一匹配,那么它将是最合适的。
答案 3 :(得分:0)
从您的示例中,您似乎只想找到最合适的一个。
我建议按特异性的升序创建一个正则表达式列表,并对您的测试用例运行多次传递。成功的第一个正则表达式将是“最合适的”。
在您给出的示例中,您可以按如下方式订购正则表达式:
然后,对于测试用例AACS,你会看到它与正则表达式1或正则表达式2不匹配,但它确实与正则表达式3匹配。所以最适合的是正则表达式3,即使它匹配正则表达式4如果它已经到了那么远。
当然这取决于你正在使用的正则表达式,你必须自己决定如何订购你的正则表达式。