我正在尝试用Java创建一个带有条件搜索词的正则表达式代码。
我的意思是让我说我有5个字;树,车,狗,猫,鸟。现在我希望表达式搜索这些术语,但是只需要匹配五个中的3个,它可以是它选择匹配的5个中的任何一个。
我想也许是使用后退引用?(3)可以工作,但似乎没有做到这一点。
标准可选搜索(?)不起作用,因为所有术语都是可选的,但是所需的匹配数不是。基本上有一种方法可以创建一个必须是50%(或任何百分比)正确的字符串来提供匹配吗?
有人会碰巧知道或者能指出我正确的方向吗?
(如果可能的话,我希望它能在客户端工作)
答案 0 :(得分:2)
它是否必须是一个独立的正则表达式而没有任何进一步的代码?对每个单词进行简单的循环测试并计算匹配应该完美地完成。伪代码假设您需要N个唯一匹配(您也可以将子字符串测试与正则表达式交换,只要您保持对正则表达式中唯一匹配的计数,无论您如何确定匹配):
bool has_N_words(int n, string[] words, string text) {
int matches = 0;
foreach word in words {
if (word.substringOf(text)) counter++
if (counter >= n) return true
}
return false
}
在我看来,这是唯一的(除了令人费解的正则表达式扩展 - 不是我有一些想法,我只是一次又一次地惊讶现代正则表达式实现允许)通过常规方式做到这一点表达式是这样的:
.*?
联系起来(这需要所有独特的排列)(?=.*word)
(这允许丢弃之前以不同顺序发生的单词组合)手动,丑陋和复杂(如在计算复杂性方面,而不是在编程工作中)自动执行,低效率以及任何方式相当hacky都是不切实际的。
答案 1 :(得分:0)
我不明白你为什么要用正则表达式来做这个,但如果你真的需要它是一个正则表达式:
/(树|汽车|狗|猫|鸟)/
然后计算你从那里得到的比赛......
答案 2 :(得分:0)
(?i)(?s)(.*(tree|car|dog|cat|bird)){3,}?.*
(?i)用于不区分大小写,(?s)用于匹配新行。*,因为您正在查看电子邮件。
的?最后是不情愿的量词。
我还没有尝试过。