正则表达式匹配一定比例的令牌 - 可能吗?

时间:2015-10-01 15:12:01

标签: regex delphi

我正在使用一种模糊匹配程序。我有一系列匹配的令牌。 (如果有任何不同,程序用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

有什么想法吗?

2 个答案:

答案 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