正则表达式查找至少重复 n 次的模式

Regex to find a pattern repeating at least n times

我被垃圾邮件摧毁了,电子邮件总是不同的,除了它们总是有类似的 link 像这样重复多次:

http://spam.com/hello/world/fk59j356jss5ptttNMdlJ96vmrDsjEeCPDXJf0fBXOi

所以我试图在我的服务器上放置一个过滤器,该过滤器将扫描一个斜杠后跟 30-50 个字母数字字符,然后至少重复 3 次。我写了以下正则表达式,但在 regex101.com 上,我不断收到 "timeout" 消息,可能是因为有更好的写法:

/(\/\w{30,50})(.+?){3,}/s

我尝试了 google,但我的搜索字词从未返回我想要的结果。

编辑

这是 link,您可以看到: https://regex101.com/r/tL9wK7/2 我们可以通过总是重复的这部分来识别垃圾邮件 link:

/bcaip86eJR2W5hKmMjFiKVWmKyLjmiMKhkOm0Mjh906

垃圾邮件中总是有类似的内容(斜线后跟一系列字母数字字符)。 link 在每封垃圾邮件中都不同,但它会在同一封邮件中重复多次。

因此,如果在同一封电子邮件中多次出现 link 后跟 30-50 个字母数字字符的 link 电子邮件,则扫描该电子邮件将表明它是垃圾邮件。

这个怎么样?

/\/(\w{30,50})(?:.*)(?:.*)/sg

这将解决您的问题,给出满足条件的示例数据。当与 regex101 link.

一起使用时,您可以通过删除最后一个捕获组来查看它的工作情况

你可以试试这个(稍微修改你的正则表达式)-

(\/\w{30,50})(.*?){3,}

Demo here

我相信我已经稍微改进了你的模式:

/(\/\w{30,})(?:.+?){3,}?/s

演示 link:https://regex101.com/r/aNdURv/1

主要变化:
1. 为什么止于 50 个字符?只要至少是 30,这个词有多长无关紧要。所以我从第一组中删除了“50”。
2. 您不需要捕获每个重复,只需将其计入您的目标总数(3 次或更多),所以我在第二组中添加了“?:”。
3. 你不需要它来找到所有匹配的重复,这意味着它可以是懒惰的,只要找到至少 3 个就可以停止。所以我加了“?”到最后。