我想知道是否存在从给定的匹配正则表达式列表中找到最佳匹配正则表达式的方法。
假设给出了以下正则表达式。
"apple.*"
"ap.*"
"app.*"
当我们从上面的表达式中搜索匹配字符串"apples"
时。应该是正确的答案。 "apple.*"
。当我们评估单词“apple”时,这三个正则表达式都是有效的。但最匹配的正则表达式是"apple.*"
,因为两个字符串几乎相同。
如果有人能为此提出建议,那就太好了。我期待在c ++中实现它
答案 0 :(得分:1)
似乎明显的方法是首先检查哪个正则表达式与所选字符串匹配。显然,任何不匹配的东西都会被淘汰。
然后选择那些匹配并计算它们包含的文字(非通配符)字符数。文字数量最多的人获胜。在(short|muchmuchlonger)
假设这与目标匹配,则不能立即清楚匹配中是否使用了short
或muchmuchlonger
,并且这种差异可能很好地决定了这种模式是否为&# 34;最强"匹配。
如果出现平局,您可以(例如)查看[abcd]
之类的集合。在这种情况下,您可能会将{em>较小设置(如[abc]
)评为较强匹配,而不是像[A-Z]
这样较大的设置。然而,后者明确指出,计算集合大小的代码需要了解正则表达式语法(否则,这两个代码看起来都像三个字符)。
最后,您要寻找的是模式中的字符拒绝字符的程度。像.*
之类的东西并不拒绝任何东西,因此它对正则表达式的强度几乎没有增加(或没有)。像a
或9
之类的简单文字拒绝除了一种可能性之外的所有文字,因此它增加了很多力量。对于一个集合,被拒绝的字符数与接受的字符数成反比。
然后我们得到[:alpha:]
或[:alnum:]
之类的内容。同样,这些基本上只是集合,所以你必须根据他们接受/拒绝的字符数来评估它们。
要做到这一切,你可能想要标记每一个""正则表达式作为一个子表达式,所以你得到sub_match
个对象告诉你每个实际匹配的对象。然后,您将每个乘以正则表达式部分拒绝的字符百分比,以获得每个字符的强度。将这些全部放在一起,你就可以得到一个整体的强度"分数。