我正在使用一种模糊匹配程序。我有一系列匹配的令牌。 (如果有任何不同,程序用Delphi XE6编写)。
我想匹配一组令牌,但是一定比例的令牌。 例如,我有一个正则表达式搜索标记'one,two'和'three'。这需要所有三个令牌。有没有办法构建一个Regex表达式,表示匹配至少50%的令牌?我知道我可以说'匹配任何令牌',然后进行子串检查和数学......
这是我的正则表达式。
^(?=.*?\bone)(?=.*?\btwo)(?=.*?\bthree).*$
作为一个例子..在PSEUDO-CODE ......我正在寻找像...这样的东西。
^[MATCH=50%MIN](?=.*?\bone)(?=.*?\btwo)(?=.*?\bthree).*$
因为我有3个令牌,\ bone,\ btwo和\ bthree,匹配至少50%的这些令牌意味着我必须匹配三个令牌中的2个,所以
one four three = MATCHED
而
one four five = NOT MATCHED
有什么想法吗?
答案 0 :(得分:0)
正则表达式用于匹配或不匹配,库中没有计算函数。您可以查找部分匹配,因此您可以查找一个,四个而不是五个的组合 - 但是您必须为每个场景创建正则表达式。
要解决这个问题,你很可能不得不寻找每件事并进行计算,看它是否大于50%。
答案 1 :(得分:0)
是的,至少在你的例子中,这可以通过制定一个简单的量化约束,2或更大来完成:
(.*\b(one|two|three)\b){2,}
它不能是计算 50%,但是如果你知道你想要匹配多少令牌,那么你知道截止点在哪里......
重复项也将计入上述情况:one four one = MATCH
。如果目标中可能存在重复项,并且您只希望匹配大多数"来源"令牌匹配,你需要在perl中等效以下内容:
/\bone\b/ + /\btwo\b/ + /\bthree\b/ >= 2