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

时间:2015-06-23 15:22:31

标签: regex regex-lookarounds

我被垃圾邮件摧毁,电子邮件总是不同的,只是它们总是有类似的链接,可以重复多次:

  

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

所以我试图在我的服务器上放一个过滤器,扫描一个斜线,然后是30-50个字母数字字符,然后重复至少3次。我写了以下正则表达式,但是在regex101.com上,我一直得到#34;超时"消息,可能是因为有更好的方法来编写它:

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

我试过谷歌,但我的搜索字词从未返回我想要的内容。

修改

这是链接,您可以看到: https://regex101.com/r/tL9wK7/2 我们可以识别此部分始终重复的垃圾邮件链接:

/ bcaip86eJR2W5hKmMjFiKVWmKyLjmiMKhkOm0Mjh906

垃圾邮件总是有类似的东西(斜杠后跟一系列字母数字字符)。此链接在每个垃圾邮件中都有所不同,但它会在同一封电子邮件中重复多次。

因此,如果在同一封电子邮件中多次显示30-50个字母数字字符的斜杠链接,则会在电子邮件中进行扫描,这表明它是垃圾邮件。

3 个答案:

答案 0 :(得分:2)

我相信我的模式略有改进:

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

演示链接:https://regex101.com/r/aNdURv/1

主要变化:
1.为什么要停50个字符?只要这个词至少30岁就不管这个词有多长。所以我删除了#34; 50"来自第一组。
2.你不需要捕获每个重复,只是为了计算你想要的总数(3或更多),所以我添加了#34;?:"到第二组。
3.你不需要它来找到所有匹配的重复,这意味着它可以是懒惰的并且只要它找到至少3就停止。所以我添加了#34;?"到最后。

答案 1 :(得分:0)

这个怎么样?

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

这将解决您的问题,给出填充标准的示例数据。当与regex101链接一起使用时,您可以通过删除最后一个捕获组来查看它。

答案 2 :(得分:0)

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

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

Demo here